1、EntityManager是一个框架,包含实体持久层的功
1) Magento\Framework\EntityManager\EntityManager类在Magento 2.1中引入,用于加载、保存、检查是否存在以及删除EAV和平面对象。能。
2)EntityManager是一种保存/加载平面表和EAV实体的新方法。
2、EntityManager 用于以下实体
catalog rule
product
category
cms block
cms page
sales rule
bundle option
bundle selection
gift card amount
and some others (staging etc.)
3、在di.xml中定义相关的操作
1)、Declare Repository:
<type name="Magento\Framework\Model\Entity\RepositoryFactory">
<arguments>
<argument name="entities" xsi:type="array">
<item name="Magento\Cms\Api\Data\PageInterface" xsi:type="string">Magento\Cms\Api\PageRepositoryInterface</item>
<item name="Magento\Cms\Api\Data\BlockInterface" xsi:type="string">Magento\Cms\Api\BlockRepositoryInterface</item>
</argument>
</arguments>
</type>
使用:$this->repositoryFactory->create($entityType)
2)、Metadata Pool:
<type name="Magento\Framework\EntityManager\MetadataPool">
<arguments>
<argument name="metadata" xsi:type="array">
<item name="Magento\Cms\Api\Data\PageInterface" xsi:type="array">
<item name="entityTableName" xsi:type="string">cms_page</item>
<item name="identifierField" xsi:type="string">page_id</item>
</item>
<item name="Magento\Cms\Api\Data\BlockInterface" xsi:type="array">
<item name="entityTableName" xsi:type="string">cms_block</item>
<item name="identifierField" xsi:type="string">block_id</item>
</item>
</argument>
</arguments>
</type>
属性包括:connectionName、eavEntityType、entityContext、entityTableName 、identifierField
sequence、sequenceTable.
相关文件: vendor/magento/framework/EntityManager/MetadataPool.php
vendor/magento/framework/EntityManager/EntityMetadata.php
vendor/magento/framework/EntityManager/Sequence/Sequence.php
3)、Hydrator Pool:
<type name="Magento\Framework\EntityManager\HydratorPool">
<arguments>
<argument name="hydrators" xsi:type="array">
<item name="Magento\Cms\Api\Data\PageInterface" xsi:type="string">Magento\Framework\EntityManager\AbstractModelHydrator</item>
<item name="Magento\Cms\Api\Data\BlockInterface" xsi:type="string">Magento\Framework\EntityManager\AbstractModelHydrator</item>
</argument>
</arguments>
</type>
相关文件:
接口:vendor/magento/framework/EntityManager/HydratorInterface.php
AbstractModel:vendor/magento/framework/EntityManager/AbstractModelHydrator.php
未定义使用:vendor/magento/framework/EntityManager/Hydrator.php
4)、Operation Pool:
<type name="Magento\Framework\EntityManager\OperationPool">
<arguments>
<argument name="operations" xsi:type="array">
//自定义
<item name="Magento\Cms\Api\Data\BlockInterface" xsi:type="array">
//常用
<item name="create" xsi:type="string">Magento\Staging\Model\Operation\Create</item>
<item name="update" xsi:type="string">Magento\Staging\Model\Operation\Update</item>
<item name="delete" xsi:type="string">Magento\Staging\Model\Operation\Delete</item>
//额外
</item>
//default
<item name="default" xsi:type="array">
<item name="read" xsi:type="string">Magento\Framework\EntityManager\Operation\Read</item>
<item name="create" xsi:type="string">Magento\Framework\EntityManager\Operation\Create</item>
<item name="update" xsi:type="string">Magento\Framework\EntityManager\Operation\Update</item>
<item name="delete" xsi:type="string">Magento\Framework\EntityManager\Operation\Delete</item>
<item name="checkIfExists" xsi:type="string">Magento\Framework\EntityManager\Operation\CheckIfExists</item>
</item>
</argument>
</arguments>
</type>
create:
接口:vendor/magento/framework/EntityManager/Operation/CreateInterface.php
实现:vendor/magento/framework/EntityManager/Operation/Create.php
主要实现:
vendor/magento/framework/EntityManager/Operation/Create/CreateMain.php
vendor/magento/framework/EntityManager/Operation/Create/CreateAttributes.php
vendor/magento/framework/EntityManager/Operation/Create/CreateExtensions.php
最终实现:vendor/magento/framework/EntityManager/Db/CreateRow.php
update:
接口:vendor/magento/framework/EntityManager/Operation/UpdateInterface.php
实现: vendor/magento/framework/EntityManager/Operation/Update.php
主要实现:
vendor/magento/framework/EntityManager/Operation/Update/UpdateMain.php
vendor/magento/framework/EntityManager/Operation/Update/UpdateAttributes.php
vendor/magento/framework/EntityManager/Operation/Update/UpdateExtensions.php
最终实现:vendor/magento/framework/EntityManager/Db/UpdateRow.php
read:
接口: vendor/magento/framework/EntityManager/Operation/ReadInterface.php
实现: vendor/magento/framework/EntityManager/Operation/Read.php
主要实现:
vendor/magento/framework/EntityManager/Operation/Read/ReadMain.php
vendor/magento/framework/EntityManager/Operation/Read/ReadAttributes.php
vendor/magento/framework/EntityManager/Operation/Read/ReadExtensions.php
最终实现:vendor/magento/framework/EntityManager/Db/ReadRow.php
delete:
接口:vendor/magento/framework/EntityManager/Operation/DeleteInterface.php
实现:vendor/magento/framework/EntityManager/Operation/Delete.php
主要实现:
vendor/magento/framework/EntityManager/Operation/Delete/DeleteExtensions.php
vendor/magento/framework/EntityManager/Operation/Delete/DeleteAttributes.php
vendor/magento/framework/EntityManager/Operation/Delete/DeleteMain.php
最终实现: vendor/magento/framework/EntityManager/Db/DeleteRow.php
5)、 Attribute Pool:
<type name="Magento\Framework\EntityManager\Operation\AttributePool">
<arguments>
<argument name="extensionActions" xsi:type="array">
<item name="eav" xsi:type="array">
<item name="default" xsi:type="array">
<item name="read" xsi:type="string">Magento\Eav\Model\ResourceModel\ReadHandler</item>
<item name="create" xsi:type="string">Magento\Eav\Model\ResourceModel\CreateHandler</item>
<item name="update" xsi:type="string">Magento\Eav\Model\ResourceModel\UpdateHandler</item>
</item>
<item name="Magento\Catalog\Api\Data\CategoryInterface" xsi:type="array">
<item name="create" xsi:type="string">Magento\Catalog\Model\ResourceModel\CreateHandler</item>
<item name="update" xsi:type="string">Magento\Catalog\Model\ResourceModel\UpdateHandler</item>
</item>
</item>
<item name="catalogRule" xsi:type="array">
<item name="Magento\CatalogRule\Api\Data\RuleInterface" xsi:type="array">
<item name="read" xsi:type="string">Magento\CatalogRule\Model\ResourceModel\ReadHandler</item>
<item name="create" xsi:type="string">Magento\CatalogRule\Model\ResourceModel\SaveHandler</item>
<item name="update" xsi:type="string">Magento\CatalogRule\Model\ResourceModel\SaveHandler</item>
</item>
</item>
</argument>
</arguments>
</type>
主要文件: vendor/magento/framework/EntityManager/Operation/AttributePool.php
action 实现接口: vendor/magento/framework/EntityManager/Operation/AttributeInterface.php
6)、Extension Pool:
<type name="Magento\Framework\EntityManager\Operation\ExtensionPool">
<arguments>
<argument name="extensionActions" xsi:type="array">
<item name="Magento\Catalog\Api\Data\ProductInterface" xsi:type="array">
<item name="read" xsi:type="array">
<item name="optionReader" xsi:type="string">Magento\Catalog\Model\Product\Option\ReadHandler</item>
<item name="mediaGalleryRead" xsi:type="string">Magento\Catalog\Model\Product\Gallery\ReadHandler</item>
<item name="categoryProductLinksRead" xsi:type="string">Magento\Catalog\Model\Category\Link\ReadHandler</item>
<item name="websiteReader" xsi:type="string">Magento\Catalog\Model\Product\Website\ReadHandler</item>
</item>
<item name="create" xsi:type="array">
<item name="custom_options" xsi:type="string">Magento\Catalog\Model\Product\Option\SaveHandler</item>
<item name="mediaGalleryCreate" xsi:type="string">Magento\Catalog\Model\Product\Gallery\CreateHandler</item>
<item name="categoryProductLinksSave" xsi:type="string">Magento\Catalog\Model\Category\Link\SaveHandler</item>
<item name="websitePersistor" xsi:type="string">Magento\Catalog\Model\Product\Website\SaveHandler</item>
<item name="tierPriceCreator" xsi:type="string">Magento\Catalog\Model\Product\Attribute\Backend\TierPrice\SaveHandler</item>
</item>
<item name="update" xsi:type="array">
<item name="optionUpdater" xsi:type="string">Magento\Catalog\Model\Product\Option\SaveHandler</item>
<item name="mediaGalleryUpdate" xsi:type="string">Magento\Catalog\Model\Product\Gallery\UpdateHandler</item>
<item name="categoryProductLinksSave" xsi:type="string">Magento\Catalog\Model\Category\Link\SaveHandler</item>
<item name="websitePersistor" xsi:type="string">Magento\Catalog\Model\Product\Website\SaveHandler</item>
<item name="tierPriceUpdater" xsi:type="string">Magento\Catalog\Model\Product\Attribute\Backend\TierPrice\UpdateHandler</item>
</item>
</item>
</argument>
</arguments>
</type>
实现文件:vendor/magento/framework/EntityManager/Operation/ExtensionPool.php
action实现接口: vendor/magento/framework/EntityManager/Operation/ExtensionInterface.php
4、实现原理:
1)、加载\Magento\Framework\EntityManager\EntityManager, 调用load、save(update、create)、delete 等方法.
2)、调用Operation Pool定义的action 执行execute 方法.
3)、operation action 主要实现里面调用metadataPool、hydratorPool、attributePool、extensionPool 等定义的操作.
4)、最后由operation action 的最终实现action, 实现sql的操作.