amitshree
amitshree

Reputation: 2298

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
{
//....
}

Upvotes: 0

Views: 707

Answers (2)

Jannes Botis
Jannes Botis

Reputation: 11242

Controller plugins do not get injected to the controller. Remove

$container->get(\Commerce\Controller\Plugin\ProductPlugin::class)

from the factory callback and also remove the 2nd parameter from the constructor of your ProductController

To use the plugin, just do:

$plugin = $this->plugin(Plugin\ProductPlugin::class);

or

// using the alias
$plugin = $this->product();

in your action controllers.

Upvotes: 2

amitshree
amitshree

Reputation: 2298

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);
        }
    ],

],

Upvotes: 0

Related Questions