enterprise patterns in magento

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

Upload: vrann-tulika

Post on 13-Jun-2015

453 views

Category:

Technology


0 download

DESCRIPTION

Mageconf2 Presentation

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