Magento 2中的ObjectManager

ObjectManager可以称为Magento2构建基础的基本概念之一,并且与Magento1相比是全新的。如果我们还记得Magento1,那么在那里创建我们需要工作的对象,我们使用了Mage类,该类提供了用于创建不同类型对象的静态方法-无论是模型,资源模型,助手还是用于创建我们想要拥有的对象在单个实例中(Mage :: getSingleton方法)。在创建Magento2时,开发团队放弃了这一想法,并实施了依赖项注入和服务合同(ServiceContracts)的原理。这就是使Magento2如此灵活,易于定制和测试的原因。而且,围绕ObjectManager构建的功能的存在使拥有自定义系统行为的所有功能成为可能,我们可以通过di.xml配置文件进行自定义。



如果我们全局地看一下ObjectManager实现的功能,那么我们可以说它是DI容器的一种实现,在PHP世界中以PSR-11表示,尽管ObjectManager本身并没有直接实现Psr \ Container \ ContainerInterface(并且没有,以Psr \ Container \ ContainerInterface假设)。它是用于创建和检索对象的集中式工具。具有用于生成所需对象的此类集中类具有以下优点。



  • 我们不需要手动初始化和管理对象(我们还需要说ObjectManager用于在Factory和Proxy类内部生成对象,这些对象是通过代码生成创建的)

  • 通过设置可以规定类应接收某个接口的哪个实现,并使用依赖关系反转的原理

  • 系统变得更容易测试
  • 可以使用代理类和工厂类(工厂)
  • 节省服务器资源,因为某些对象没有重新初始化,而是从已创建的缓存对象中获取(共享设置)


如果我们更详细地考虑最后一点,那么我们必须说Magento \ Framework \ ObjectManager \ ObjectManager类本身具有受保护的属性$ _sharedInstances = []。此属性包含不应创建超过1次的对象,并且在请求接收它们时,只需通过键从该数组(缓存)中获取它们-键是类的全名,其中包括名称空间(namespace)。但是ObjectManager类如何确切知道应在此数组中放置哪些类?



默认情况下,通过ObjectManager创建的所有对象都具有shared = true设置。但是可以更改此行为-为此,在xml文件中有一个特殊的共享设置。例如,您可以声明侦听器(观察者)的类。





<observer name="legacy_model_save"
          instance="Magento\Framework\EntityManager\Observer\BeforeEntitySave" shared="false"/>


. , type. , true -, .



ObjectManager . , Http.



index.php, , Magento\Framework\App\Bootstrap

create, 2 :



  • — $_SERVER +


create createObjectManagerFactory, Magento\Framework\App\ObjectManagerFactory Bootstrap, , Magento\Framework\App\ObjectManager. , . Magento\Framework\App\Http::launch ObjectManager  Magento\Framework\App\ObjectManager::configure. di.xml. ObjectManager preference, type, virtualType. ObjectManager — Magento\Framework\ObjectManager\Config\Config, Magento\Framework\ObjectManager\ConfigInterface. di.xml : preference, type, virtualType . preference’ ObjectManager’ .



2 ObjectManager: create get. , create ( , Factory method), get , , .



— (, Magento\Framework\ObjectManager\FactoryInterface), , Magento\Framework\ObjectManager\Factory. php . Magento\Framework\ObjectManager\Factory\AbstractFactory::createObject, . ObjectManager , , .



Magento\Framework\ObjectManager\Code\Generator. , , , Factory Proxy , (Proxy di.xml) . Proxy-, , , proxy-, , ( Proxy). , . Factory factory method, create, ObjectManager Magento\Framework\App\ObjectManager::create.




All Articles