我知道目前Magento 2(2.1.2)中的许多代码或多或少是从Magento 1移植的,并且将来很多代码将被等效代码替代。在这方面,我想知道Magento 2系列的未来。
让我解释:
Magento 1:
在Magento 1中,我们习惯于获得这样的集合:
$products = Mage::getModel('catalog/product')->getCollection();
然后,我们可以对集合应用过滤器和其他操作:
$products->addAttributeToFilter('price', ['gteq' => 10]);
$products->addFieldToFilter('created_at', ['lt' => '2016-10-10']);
$products->setPageSize(10);
// ... etc ...
最后但并非最不重要的一点是,我们的集合将返回模型:
foreach ($products as $product) {
echo get_class($product); // Mage_Catalog_Model_Product
}
Magento 2:
Magento添加了许多新的抽象层,实现了一种更可靠的工作方式。这意味着当我们想要实体列表时,我们从存储库中请求它:
$productResults = $this->productRepository->getList($searchCriteria);
如果我们要应用过滤器,我们使用的一个组合SearchCriteriaBuilder
,在FilterGroupBuilder
中,FilterBuilder
和SortOrderBuilder
:
$this->searchCriteriaBuilder->addSortOrder(
$this->sortOrderBuilder
->setField('created_at')
->setAscendingDirection()
->create()
);
$priceFilter = $this->filterBuilder
->setField('price')
->setValue(10)
->setConditionType('gteq')
->create();
$createdAtFilter = $this->filterBuilder
->setField('created_at')
->setValue('2016-10-10')
->setConditionType('lt')
->create();
$filterGroups = [
$this->filterGroupBuilder->addFilter($priceFilter)->create(),
$this->filterGroupBuilder->addFilter($createdAtFilter)->create()
];
而且,如果我们要遍历结果,则可以得到数据模型,而不是实际的(继承的)模型:
foreach ($productResults->getItems() as $product) {
echo get_class($product); // \Magento\Catalog\Model\Data\Product
}
这种抽象遵循SOLID原则,并包含“继承之上的组成”原则。否则将在集合上执行的任何“外来”操作(例如示例连接)都在存储库内部进行,这也使得在模块外部使用起来更加容易。
问题:
所有这些使我感到奇怪:在整个存储库/数据模型方法中,Magento 2的未来是否有收集空间?集合只能在模块内部内部使用,而不能在模块外部使用吗?还是不赞成使用实体管理器?
当前,如果您想使用数据模型,则仍必须创建一个继承模型(继承自\Magento\Framework\Model\AbstractModel
),以使集合正常工作(因为Magento\Framework\Data\Collection::setItemObjectClass
要求模型从扩展Magento\Framework\DataObject
)。而且您需要进行收集才能在存储库中进行过滤。但是再说一次,在存储库中,您必须将(常规)模型“转换”为数据模型。
还是我们必须像Order Repository那样实现它,在其中getList()
返回的实例Magento\Sales\Api\Data\OrderSearchResultInterface
,但是在水下搜索结果仅是实现此接口的常规集合。有趣的事实:搜索结果表明它将返回一个数据模型(Magento\Sales\Api\Data\OrderInterface[]
)数组,但是如果您分析代码,getItems()
则会执行Magento\Framework\Data\Collection::getItems()
该代码,而不是返回数据模型,而是返回订单模型(由设置Magento\Sales\Model\ResourceModel\Order\Collection::_construct()
)。对于“组成而不是继承”而言,就这么多。
关于Magento 2的正确方法有很多问题。同样,有100种方法可以做相同的事情,但是什么是Magento Way?还是我在这里完全走错了路?