这里是覆盖 Magento\Catalog\Model\Layer\FilterList 这个类的完整代码
我可以使用 virtualType 方法替代 preference
registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Pradip_LayerModel',
__DIR__
);
etc/module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Pradip_LayerModel" setup_version="0.1.0"/>
</config>
etc/frontend/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<virtualType name="categoryFilterList" type="Pradip\LayerModel\Model\Layer\FilterList">
<arguments>
<argument name="filterableAttributes" xsi:type="object">Magento\Catalog\Model\Layer\Category\FilterableAttributeList</argument>
</arguments>
</virtualType>
</config>
模型/层/FilterList.php
<?php
namespace Pradip\LayerModel\Model\Layer;
/**
* Override FilterList Class
*/
class FilterList extends \Magento\Catalog\Model\Layer\FilterList
{
public function getFilters(\Magento\Catalog\Model\Layer $layer)
{
//echo "you can write code changes here"; exit;
if (!count($this->filters)) {
$this->filters = [
$this->objectManager->create($this->filterTypes[self::CATEGORY_FILTER], ['layer' => $layer]),
];
foreach ($this->filterableAttributes->getList() as $attribute) {
$this->filters[] = $this->createAttributeFilter($attribute, $layer);
}
}
return $this->filters;
}
}
?>