magento dependency injection

31
Magento DI Киев 15 сентября 2012

Upload: anton-kril

Post on 26-Jun-2015

688 views

Category:

Design


0 download

TRANSCRIPT

Page 1: Magento Dependency Injection

Magento DI

Киев15 сентября 2012

Page 2: Magento Dependency Injection

Software Entropy

Pull-approach and its problems

Push-approach

Magento Object Manager

Page 3: Magento Dependency Injection

Software entropy

Page 4: Magento Dependency Injection

Software entropy cycle

Page 5: Magento Dependency Injection

Pull-approach

Page 6: Magento Dependency Injection

Mage::getModel(“Mage_Cms_Model_Page”)

Mage::getSingleton(“Mage_Cms_Model_Page”)

Page 7: Magento Dependency Injection

class Mage_Cms_Model_Page{ public function __construct() { $this->_idFieldName = }  public function getAvailableStatuses() { $statuses = new Varien_Object(array( self::STATUS_ENABLED => ->__('Enabled') self::STATUS_DISABLED => ->__(‘Disabled') ));  ('cms_page_get_available_statuses', array('statuses' => $statuses));  }}

Mage::getResourceSingleton($this->_resourceName);

Mage::helper('Mage_Cms_Helper_Data')

Mage::helper('Mage_Cms_Helper_Data')

Mage::dispatchEvent

Page 8: Magento Dependency Injection

class Mage_Cms_Model_PageTest extends PHPUnit_Framework_TestCase{ public function setUp() { $this->_page = new Mage_Cms_Model_Page(); }}

Page 9: Magento Dependency Injection

class Mage_Cms_Model_PageTest extends PHPUnit_Framework_TestCase{ public function setUp() { Mage::setResourceSingleton(‘Page_Resource’, $this->getMock(‘Page_Resource’));

$this->_page = new Mage_Cms_Model_Page(); }

public function testProcessDoesSomething() { Mage::setHelper(‘Mage_Cms_Helper_Data’, $this->getMock(‘Mage_Cms_Helper_Data’)); $this->assertSomething($this->_page->process()); }

}

Page 10: Magento Dependency Injection

Mage::getXXX() ===

Page 11: Magento Dependency Injection

Push-approach

Page 12: Magento Dependency Injection

class Mage_Core_Model_Abstract { public function __construct(array $data = array()) { parent::__construct($data); $this->_construct(); } }

Page 13: Magento Dependency Injection

class Mage_Core_Model_Abstract { public function __construct( Mage_Core_Model_Event_Manager $eventDispatcher, Mage_Core_Model_Cache $cacheManager, Mage_Core_Model_Resource_Abstract $resource = null, Varien_Data_Collection_Db $resourceCollection = null, array $data = array() ) { $this->_eventDispatcher = $eventDispatcher; $this->_cacheManager = $cacheManager; $this->_resource = $resource; $this->_resourceCollection = $resourceCollection; parent::__construct($data); $this->__construct(); } }

Page 14: Magento Dependency Injection

Mage::getXXX()

Mage_Some_Class::__construct()Magento_ObjectManager

Page 15: Magento Dependency Injection

Magento Object Manager

Page 16: Magento Dependency Injection

interface Magento_ObjectManager{ public function get($className, $arguments);  public function create($className, $arguments); }

Page 17: Magento Dependency Injection
Page 18: Magento Dependency Injection

Zend\Di

Page 19: Magento Dependency Injection

class Mage_Core_Model_Abstract { public function __construct( Mage_Core_Model_Event_Manager $eventDispatcher, Mage_Core_Model_Cache $cacheManager, Mage_Core_Model_Resource_Abstract $resource = null, Varien_Data_Collection_Db $resourceCollection = null, array $data = array() ) { $this->_eventDispatcher = $eventDispatcher; $this->_cacheManager = $cacheManager; $this->_resource = $resource; $this->_resourceCollection = $resourceCollection; parent::__construct($data); $this->__construct(); } }

Page 20: Magento Dependency Injection

<config> <global> <di> <Mage_Core_Model_Cache> <parameters> <cacheDir>/path/to/cache/dir</cacheDir> </parameters> </Mage_Core_Model_Cache> </di> </global></config>

Page 21: Magento Dependency Injection

<di> <Magento_Data_Structure> <shared>0</shared> </Magento_Data_Structure></di>

Page 22: Magento Dependency Injection

public function __construct(Some_Interface $processor)

Page 23: Magento Dependency Injection

<adminhtml> <di> <preferences> <Some_Interface>Some_Backend_Implementation</Some_Interface> </preferences> </di></adminhtml><api> <di> <preferences> <Some_Interface>Some_Api_Implementation</Some_Interface> </preferences> </di></api>

Page 24: Magento Dependency Injection

INJECTABLES - NON-INJECTABLESVarien_Db_AdapterMage_Core_Model_CacheMage_Core_Model_Config

Mage_Catalog_Model_ProductMage_Wishlist_Model_Wishlist

Page 25: Magento Dependency Injection

class Varien_Data_Collection{ //...  public function getNewEmptyItem() { return Mage::getModel($this->_itemObjectClass); }  //...}

Page 26: Magento Dependency Injection

class Varien_Data_Collection{ public function __construct(Magento_ObjectFactory $factory) { $this->_itemFactory = $factory; }  //... public function getNewEmptyItem() { return $this->_itemFactory->create(); } //...}

Page 27: Magento Dependency Injection

class Mage_Catalog_Model_Product_Factory implements Magento_ObjectManager_Factory{ protected $_objectManager;  public function __construct(Magento_ObjectManager $objectManager) { $this->_objectManager = $objectManager; }  public function createFromArray(array $arguments = array()) { return $this->_objectManager->create('Mage_Catalog_Model_Product', $arguments); }}

Page 28: Magento Dependency Injection

class Mage_Review_Model_Observer{ public function processDeletedProduct (Varien_Event_Observer $observer) { $productId = $observer->getEvent()->getProduct()->getId();

if ($productId) { Mage::getResourceSingleton('Mage_Review_Model_Resource_Review') ->deleteReviewsByProductId($productId); } }}

Page 29: Magento Dependency Injection

class Mage_Review_Model_Observer{ public function __construct(Mage_Review_Model_Resource_Review $review) { $this->_reviewResource = $reviewResource; }  //...}

Page 30: Magento Dependency Injection

<di> <Mage_Review_Model_Observer> <parameters> <review> Mage_Review_Model_Resource_Review_Proxy </review> </parameters> </ Mage_Review_Model_Observer ></di>

Page 31: Magento Dependency Injection

class Mage_Review_Model_Resource_Review_Proxy extends Mage_Review_Model_Resource_Review{ public function __construct(Magento_ObjectManager $objectManager) { $this->_objectManager = $objectManager; } 

public function deleteReviewByProductId($productId) { return $this->_objectManager ->get('Mage_Review_Model_Resource_Review ') ->deleteReviewByProductId(); }}