0

Which interface instantiation is missing in my constructor

namespace Vendor\Module\Block;

use Magento\Catalog\Block\Product\ListProduct;
use Magento\Catalog\Model\Layer\Resolver as LayerResolver;
use Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection;
use Magento\CatalogSearch\Helper\Data;
use Magento\Framework\View\Element\Template;
use Magento\Framework\View\Element\Template\Context;
use Magento\LayeredNavigation\Block\Navigation;
use Magento\Search\Model\QueryFactory;
use Magento\Catalog\Model\Layer\FilterableAttributeListInterface;
use Magento\Catalog\Model\Layer\FilterList;
use Magento\Catalog\Model\Layer\AvailabilityFlagInterface;
use Magento\Catalog\Model\Layer\Category\FilterableAttributeList;

class Result extends \Magento\Framework\View\Element\Template
{

   protected $tglssearchHelper;
   protected $catalogLayer;
   public function __construct(
   Context $context,
    LayerResolver $layerResolver,
    \Magento\Catalog\Model\Layer\FilterList $filterList,
    \Magento\Catalog\Model\Layer\AvailabilityFlagInterface $visibilityFlag,
    \Vendor\Module\Helper\Data $tglssearchHelper,
    QueryFactory $queryFactory,
    FilterableAttributeListInterface $filterableAttributes,
    array $data = []
) {
    $this->catalogLayer = $layerResolver->get();
    $this->tglssearchHelper = $tglssearchHelper;
    $this->queryFactory = $queryFactory;
    $this->filterableAttributes = $filterableAttributes;
    parent::__construct(
        $context,
        $data
    );
}

 protected function _prepareLayout()
  {

    $this->renderer = $this->getChildBlock('renderer');
    foreach ($this->filterList->getFilters($this->_catalogLayer) as $filter) {
        $filter->apply($this->getRequest());
    }
    $this->getLayer()->apply();
    return parent::_prepareLayout();
 }
}

my etc di

 <?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\CatalogSearch\Controller\Result\Index" type="Vendor\Module\Controller\Result\Index" />
<preference for="Magento\Catalog\Controller\Category\View" type="Vendor\Module\Controller\Category\View" />
<preference for="Magento\CatalogSearch\Block\Result" type="Vendor\Module\Block\Result" />
<preference for="Magento\LayeredNavigation\Block\Navigation" type="Vendor\Module\Block\Navigation" />
<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\Module\Block\Product\ListProduct" />
<preference for="Magento\Catalog\Block\Product\ProductList\Toolbar" type="Vendor\Module\Block\Product\ProductList\Toolbar" />
 <preference for="Magento\Catalog\Model\ResourceModel\Product\Collection" type="Vendor\Module\Model\ResourceModel\Product\Collection" />
<!-- <type name="Magento\Catalog\Model\ResourceModel\Product\Collection">
    <plugin name="mymoduletag" type="Vendor\Module\Model\ResourceModel\Product\Collection" sortOrder="10"/>
</type> -->
 </config>

I get :

Cannot instantiate interface Magento\Catalog\Model\Layer\FilterableAttributeListInterface in C:\xampp\htdocs\magento2x_2\lib\internal\Magento\Framework\ObjectManager\Factory\Dynamic\Developer.php on line 73

2
  • is this your own class or a core one? And if it's your own, are you trying to use it on frontend or backend?
    – Marius
    Jul 5, 2016 at 13:28
  • Please see updated answer .. to use filterList i have used as above
    – Sushivam
    Jul 5, 2016 at 14:32

1 Answer 1

1

If you are trying to use this \Magento\Catalog\Model\Layer\AvailabilityFlagInterface as a dependency for a class that you are going to use in the backend, you need to add this to the adminhtml/di.xml of your module

<preference for="Magento\Catalog\Model\Layer\AvailabilityFlagInterface" type="Magento\Catalog\Model\Layer\Category\AvailabilityFlag" />

If you are going to use it on frontend it should work without any issues.

This happens because the preference (the class to use by default by the object manager) for the interface Magento\Catalog\Model\Layer\AvailabilityFlagInterface is declared in app/code/Magento/LayeredNavigation/etc/frontend/di.xml so it only works for frontend.

5
  • Please see updated answer .. to use filterList i have used as above
    – Sushivam
    Jul 5, 2016 at 14:32
  • updated my etc di in answer as well
    – Sushivam
    Jul 5, 2016 at 14:34
  • i added AvailabilityFlagInterface in an assumption that error was thrown because of some missing dependencies, nyways im not using this AvailabilityFlagInterface, i need filterList(i suppose its from LayeredNavigation) which i need it in my Result.php
    – Sushivam
    Jul 5, 2016 at 14:40
  • any update on this? @Marius
    – Sushivam
    Jul 6, 2016 at 10:53
  • @SachinS I have no other idea.
    – Marius
    Jul 6, 2016 at 10:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.