如何在zend framework 3中注入和使用插件

How to inject and use plugin in zend framework 3

我有一个控制器 Controller\Api\ProductController 用于休息呼叫,它在 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)
            );
        }
    ]
]

在上面的代码中你可以看到我正在注入一个插件 class \Commerce\Controller\Plugin\ProductPlugin::class ,它在 module.config.php

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

现在当我击中其余部分时 url 它显示错误消息

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

我错过了什么?

插件代码是

<?php

namespace Commerce\Controller\Plugin;

use Zend\Mvc\Controller\Plugin\AbstractPlugin;

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

控制器插件不会注入控制器。 移除

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

从工厂回调并从 ProductController 的构造函数中删除第二个参数

要使用该插件,只需执行以下操作:

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

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

在你的动作控制器中。

我正在使用 Base 控制器,我不得不通过依赖项注入插件 根据要求。 以上配置没问题。我所要做的就是在 service_manager 部分定义我的插件。

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

],