460 likes | 600 Views
Ibiza, June 4 th – 7 th 2011. Application Models Design. Lessons Learned in Magento Models. by Anton Makarenko , PHP-Developer at Magento 2. Research. Goals: Better maintainable model layer, less code coupling Better solution for multiple RDBMSs support. Application Models Design.
E N D
Application Models Design Lessons Learned in Magento Models by Anton Makarenko, PHP-Developer at Magento 2
Research Goals: • Better maintainable model layer, less code coupling • Better solution for multiple RDBMSs support
Application Models Design • Domain and Service Layers • Models Design in Magento • Collections Design in Magento • Entities and Service Layer in Doctrine ORM • Possible Solution for Magento
Theoretical Background Domain and Service Layers
Decomposing Model Layer by Role • Domain model – an entity or business rule implementation • Service model – application logic: instantiation, composition, collectionsand data delivery
Entity (Domain Model) • Represents a “real-world” entity • Defines data fields and a way to identifyan entity • Protects data integrity • Implements domain behavior
Service Model Layer • Implements arbitrary application logic • Arbitrary hierarchy of models for: • Data mapping • Composition of models, domains • Utility purposes
Criteria for Creating Hierarchy of Models • Complexity of task • Necessity for different use cases • Requirements for application flexibility
Model Hierarchy Detalization Toy Vehicle Wheel Car Car Truck Driver’s Seat Frame
Data Sharing Between Models Horizontal Exchange Vertical Exchange Different namespaces = mapping between models of different hierarchy levels Strive to loose dependencies • One namespace between “neighbors” • Allow dependencieson the same level
Data Encapsulation in Models Entity Model Service Model Stateless or with predictable state Laconic public interface • Enforce all requiredand valid datain constructor and setters • Allow to inject data only through strict interface
Models Design in Magento Backwards Compatibility
Super Models in Magento Reuse Through Inheritance Reuse Through Composition Real “is-a” relations, polymorphism Less coupling, more freedom in designing classes More scalable and more expensive in termsof number of objectsin memory • Constrains designing classes hierarchy • No natural “is-a” relation • Fails attempt to reuse code by bloating interface Backwards Compatibility
Cons Varien_Object
Entity and Resource Models Summary • Dynamic entity structure: • Domain structural inconsistency • DB DDL overhead • Scattered service logic • Contaminated entity models • Code encapsulation challenge • Exposure of DB layer Backwards Compatibility
The Real Purpose of Collections Collection “Natural” Purpose Collection in Magento Enforce type – Yes Iterate & Lazy-load – Yes Data set formalization: fields, filters, limitation, sorting Part of service layer: Deals with database Instantiates objects • To enforce data of certain type • Iterating capability • The “Lazy-Load” pattern triggered by iteration
Components that Depend on Collections • Domain models • Service layer • Controllers and view (templates) • Special case – (admin) grids
Collections Hierarchy Varien_Data_Collection Varien_Db_Adapter_* Varien_Data_Collection_Db Mage_Core_Model_Resource_Abstract Mage_Core_Model_Resource_Db_Collection_Abstract Mage_Core_Model_Resource_Db_Abstract Mage_Core_Model_Resource Mage_Cms_Model_Resource_Page_Collection Mage_Cms_Model_Resource_Page
Collections as Resources • Duplication of resource layer logic • Necessity to break encapsulation • Necessity to implement collection classfor each entity Backwards Compatibility
The Triangle 3x ~200
How Doctrine ORM Works Controller, View… Other Domainand Service Models Doctrine ORM XML, YAML, PHPDoc Entity Manager DB
Can Doctrine ORM Be Adopted in Magento? • A ready solution for domain and service layers • Entities – a best practice implementation • Entity manager and data persistence • Collections • Database abstraction layer (DBAL)
Doctrine ORM Can’t Be Adopted in Magento • Migration efforts to DBAL • Potential performance issues: • There are up to 30 classes loaded to instantiate an entity • Objects initialization through unserialize() – possible performance bottleneck
Future Compatibility with Doctrine ORM • Entity fields to be declared as class attributes • One or more entity fields to serveas identity key
Magento 2 Possible Solutionfor Magento
Implementing Entities • Move out service layer logic from domain models: • No persistence handling • No cascade handling of other entities • Enforce domain model consistency using strict constructor, type hintingin setters and declared fields
OrigData Use Cases • getOrigData($key) • track changes “before save” (service layer) • getOrigData() • log object changes (Enterprise_Logging) • hasDataChanges() • rare specific cases in different places (service, controllers)
Implementing Service Layer • Entity managers: generic for primitive entities, custom for complex entities • Data (database) access inside entity manager = disband resource models • Implement data set handling in entity managers (ex-collections territory)
New Entity Manager Responsibilities • Deal with DB access layer directly • CRUD operations • Get collection data from DB
Service Layer and Multiple RDBMSs Zend_Db_Adapter_Abstract Zend_Db_Adapter_Pdo_Mysql Varien_Db_Adapter_Pdo_Mysql
Service Layer and Multiple RDBMSs Zend_Db_Adapter_Abstract Zend_*_Pdo_Mssql Zend_Db_Adapter_Pdo_Mysql Zend_*_Oracle Varien_*_Pdo_Mssql Varien_Db_Adapter_Pdo_Mysql Varien_*_Oracle
Service Layer and Application Resources Slightly reduced collections responsibility: • No more DB layer access • No more objects instantiation • Data set formalization delegatedto separate utility class ~200 1
Summary, Q & A • Better maneuver space for domain models • DB abstraction layer improved for better multiple RDBMSs support • Lightweight service layer Thank you!