Search code examples
phpzend-framework3

How to inject and use plugin in zend framework 3


I've a controller Controller\Api\ProductController for rest call and it's defined in module.config.php

'controllers' => [
    'factories' => [
        Controller\Api\ProductController::class => function($container) {
            return new Controller\Api\ProductController(
                $container->get(\Commerce\Model\Product::class), $container->get(\Commerce\Controller\Plugin\ProductPlugin::class)
            );
        }
    ]
]

In the above code you can see I'm injecting a plugin class \Commerce\Controller\Plugin\ProductPlugin::class which is defined in module.config.php

'controller_plugins' => [
    'factories' => [
        Controller\Plugin\ProductPlugin::class => InvokableFactory::class,
    ],
    'aliases' => [
        'product' => Controller\Plugin\ProductPlugin::class,
    ]
]

Now when I'm hitting the rest url it shows error message

Unable to resolve service "Commerce\Controller\Plugin\ProductPlugin" to a factory; are you certain you provided it during configuration?

What I'm missing ?

Plugin code is

<?php

namespace Commerce\Controller\Plugin;

use Zend\Mvc\Controller\Plugin\AbstractPlugin;

class ProductPlugin extends AbstractPlugin
{
//....
}

Solution

  • I'm using a Base controller and I had to inject plugins through dependencies based on the request. Above configuration was fine. All I had to do is define my plugin in service_manager section.

    'service_manager' => [
        'factories' => [
            Controller\Plugin\ProductPlugin::class => function($sm) {
               $dependencies = /////
                $model = new \Commerce\Model\Product($dependencies);
                return new Controller\Plugin\ProductPlugin($model);
            },
            \Commerce\Model\Product::class =>  function($sm) {
                $dependencies = /////
                return new \Commerce\Model\Product($dependencies);
            }
        ],
    
    ],