Top Banner
Тулика Евгений Magento Developer Professional Services Team [email protected] m Шаблон Шаблон ы ы корпоративн корпоративн ых ых приложений в приложений в Magento Magento
22

Enterprise Patterns in Magento

Jun 13, 2015

Download

Technology

Vrann Tulika

Mageconf2 Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Enterprise Patterns in Magento

Тулика ЕвгенийMagento DeveloperProfessional Services Team

[email protected]

ШаблонШаблоныы корпоративн корпоративных ых приложений в приложений в MagentoMagento

ШаблонШаблоныы корпоративн корпоративных ых приложений в приложений в MagentoMagento

Page 2: Enterprise Patterns in Magento

Craig Craig LarmanLarman Craig Craig LarmanLarman

Шаблоны. Почему о них говорятШаблоны. Почему о них говорят??

BBШаблонШаблоны не содержат ы не содержат новых идейновых идей

CCШаблоны имеют именаШаблоны имеют имена

DDШаблоны облегчают Шаблоны облегчают общениеобщение

Page 3: Enterprise Patterns in Magento

Domain LogicDomain Logic

Object-Relational BehaviorObject-Relational Behavior

Data SourceArchitecture

• Transaction Script• Domain Model

• Transaction Script• Domain Model

• Data Mapper• Table Data

Gateway• Active Record

• Data Mapper• Table Data

Gateway• Active Record

• Identity Map• Lazy Load

• Identity Map• Lazy Load

Page 4: Enterprise Patterns in Magento

Представление бизнес-логикиПредставление бизнес-логики

Простой путь: декомпозиция по действиям

AccountActions+ Login+ Register+ Logout+ ShowAccount

AccountActions+ Login+ Register+ Logout+ ShowAccount

CheckoutActions+ addToCart+ showCheckout+ submitCheckout

CheckoutActions+ addToCart+ showCheckout+ submitCheckout

Page 5: Enterprise Patterns in Magento

Transaction ScriptTransaction Script

Каждая операция реализована своим методом

public function addToCart(){ //retrieve user data from session //retrieve product from database //add product information to quote //… //… //save quote data to database }

Page 6: Enterprise Patterns in Magento

Объектами представлены реальные сущности

Domain ModelDomain Model

OrderOrder

Customer_AddressCustomer_Address

CategoryCategory ProductProduct

QuoteQuote PaymentPayment CartCart

CustomerCustomer

Business Logic Layer

Page 7: Enterprise Patterns in Magento

Расслоение. А кРасслоение. А как в ак в Magento?Magento?

Sales|--Block|--controllers|--etc|--Helper|--Model| |--Mysql4| |-- Billing| |-- Entity| |-- Payment| |-- Order.php| |-- Quote.php

Data Access ObjectsData Access Objects

Data MappersData Mappers

Domain ModelsDomain Models

Service LayerService Layer

Page 8: Enterprise Patterns in Magento

Mapping Objects to Data SourceMapping Objects to Data Source

Page 9: Enterprise Patterns in Magento

Data MapperData Mapper/*Осуществляет передачу данных между объектами и базой данных, сохраняя их независимыми друг от друга и от самого маппера*/

Page 10: Enterprise Patterns in Magento

Zend WayZend Way<?phpclass App_Model_UserDataMapper{ public function save(App_Model_User $user) { $dao = $this->getDao(); $id = $user->getId(); if (!$id) { $id = $dao->insert($user->toArray()); } else { $dao->update($user->toArray(), array(‘id=?’, $id)); } $record = $dao->find($id)->current(); $user->setOptions($record->toArray()); return $user; }

MatthewMatthew WeierWeier O’PhinneyO’Phinney

Page 11: Enterprise Patterns in Magento

Вернемся к Вернемся к MagentoMagento

Sales|--Block|--controllers|--etc|--Helper|--Model| |--Mysql4| | |--Order.php| | |--Quote.php| |-- Billing| |-- Entity| |-- Payment| |-- Order.php| |-- Quote.php

Ресурс-моделиРесурс-модели

<global> <models> <sales> <class>Mage_Sales_Model</class> <resourceModel>sales_mysql4</resourceModel> </sales> <sales_mysql4> <class>Mage_Sales_Model_Mysql4</class> <sales_mysql4> <sales> <models> <!-- ... --></global>

Mage::getResourceModel('sales/order'); ->load($order, $id, $field);

Page 12: Enterprise Patterns in Magento

public function load(Mage_Core_Model_Abstract $object, $value, $field=null){ if (is_null($field)) { $field = $this->getIdFieldName(); }

$read = $this->_getReadAdapter(); if ($read && !is_null($value)) { $select = $this->_getLoadSelect($field, $value, $object); $data = $read->fetchRow($select); if ($data) { $object->setData($data); } } $this->_afterLoad($object); return $this;}

Mage_Core_Model_Mysql4_AbstractMage_Core_Model_Mysql4_Abstract

Page 13: Enterprise Patterns in Magento

Структура ресурс-моделиСтруктура ресурс-модели

Mage_Core_Model_Mysql4_Abstract

+ getMainTable()+ load()+ save()+ delete()#_prepareDataForTable()

Mage_Core_Model_Mysql4_Abstract

+ getMainTable()+ load()+ save()+ delete()#_prepareDataForTable()

Mage_Core_Model_Resource_Abstract

#_getWriteAdapter()#_getReadAdapter()+ beginTrasnsaction()

Mage_Core_Model_Resource_Abstract

#_getWriteAdapter()#_getReadAdapter()+ beginTrasnsaction()

Page 14: Enterprise Patterns in Magento

Отличия от классикиОтличия от классикиДоменные модели знают о своих ресурс-

моделях

public function getProductIds() { $ids = $this->getData('product_ids'); if (is_null($ids)) { $ids = $this->_getResource()->getProductIds($this); $this->setProductIds($ids); } return $ids; }

Mage_Sales_Model_OrderMage_Sales_Model_Order

Page 15: Enterprise Patterns in Magento

Lazy and Eager LoadingLazy and Eager Loading

• Может загрузить излишне много данных

• Все данные есть под рукой

• Может загрузить излишне много данных

• Все данные есть под рукой

• Все данные есть под рукой

• Может потребоваться слишком много обращений к базе

• Все данные есть под рукой

• Может потребоваться слишком много обращений к базе

Page 16: Enterprise Patterns in Magento

Lazy Loading in Magento

public function getAddressesCollection() { if (is_null($this->_addresses)) { $this->_addresses = Mage::getResourceModel('sales/order_address_collection') ->setOrderFilter($this); if ($this->getId()) { foreach ($this->_addresses as $address) { $address->setOrder($this); } } } return $this->_addresses; }

Mage_Sales_Model_OrderMage_Sales_Model_Order

Page 17: Enterprise Patterns in Magento

АльтернативАльтернативы. ы. Table Data GatewayTable Data GatewayName City Telephone Age Insurance

Eugene Kyiv +3804456 21 32453453

Igor New York +45066 23452345Model_DbTable_Person

+find()+findWithName()+update()+insert()+delete()

Model_DbTable_Person

+find()+findWithName()+update()+insert()+delete()

Model_Person

+getName()+getAddress()+sendEmail()+addFriend()+getFRiendSuggestions()

Model_Person

+getName()+getAddress()+sendEmail()+addFriend()+getFRiendSuggestions()

Page 18: Enterprise Patterns in Magento

АльтернативАльтернативы. ы. Active RecordActive RecordName City Telephone Age Insurance

Eugene Kyiv +3804456 21 32453453

Igor New York +45066 23452345Model_Person

+getName()+getAddress()+sendEmail()+addFriend()+getFriendSuggestions()

+find()+findWithName()+update()+insert()+delete()

Model_Person

+getName()+getAddress()+sendEmail()+addFriend()+getFriendSuggestions()

+find()+findWithName()+update()+insert()+delete()

Page 19: Enterprise Patterns in Magento

Коллекции. Коллекции. Identity MapIdentity Map

Identity Map

empty

getElement(green)getElement(green)

find()find()

load()load() Identity Map

return( )return( )

Page 20: Enterprise Patterns in Magento

Magento Collections

Sales|--Model| |--Mysql4| | |-- Collection| | | | -- Abstract.php| | | -- Report| | | | -- Collection.php| | |--Order.php| | |--Quote.php| |-- Billing| |-- Entity| |-- Payment| |-- Order.php| |-- Quote.php

Ресурс-коллекцииРесурс-коллекции

$children = $this->getResourceCollection() ->setOrderFilter($orderFilter) ->addPaymentIdFilter($paymentId) ->addParentIdFilter($this->getId());

Mage::getResourceModel('sales/order_collection') ->addFieldToSelect(‘*‘) ->setOrder(‘created_at‘, ‘desc');

Page 21: Enterprise Patterns in Magento

Структура коллекцииСтруктура коллекции

Varien_Data_Collection_Db

+isLoaded()+load()#_loadCache()#_saveCache()

Varien_Data_Collection_Db

+isLoaded()+load()#_loadCache()#_saveCache()

Mage_Core_Model_Mysql4_Collection_Abstract

+addFiedToSelect()+setModel()+setResourceModel()+save()

Mage_Core_Model_Mysql4_Collection_Abstract

+addFiedToSelect()+setModel()+setResourceModel()+save()

Varien_Data_Collection

+getItemsByColumnValue()+addItem()+walk()

Varien_Data_Collection

+getItemsByColumnValue()+addItem()+walk()

CountableCountable

IteratorAggregateIteratorAggregate