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

Php 如何在zend framework 3中插入和使用插件,php,zend-framework3,Php,Zend Framework3,我有一个用于rest调用的控制器controller\Api\ProductController,它在module.config.php 'controllers' => [ 'factories' => [ Controller\Api\ProductController::class => function($container) { return new Controller\Api\ProductController(

我有一个用于rest调用的控制器
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)
            );
        }
    ]
]
'controller_plugins' => [
    'factories' => [
        Controller\Plugin\ProductPlugin::class => InvokableFactory::class,
    ],
    'aliases' => [
        'product' => Controller\Plugin\ProductPlugin::class,
    ]
]
在上面的代码中,您可以看到我正在注入一个插件类
\Commerce\Controller\plugin\ProductPlugin::class
,它在
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)
            );
        }
    ]
]
'controller_plugins' => [
    'factories' => [
        Controller\Plugin\ProductPlugin::class => InvokableFactory::class,
    ],
    'aliases' => [
        'product' => Controller\Plugin\ProductPlugin::class,
    ]
]
现在,当我点击RESTURL时,它会显示错误消息

无法将服务“Commerce\Controller\Plugin\ProductPlugin”解析为 工厂;您确定在配置过程中提供了它吗

我错过了什么

插件代码是

<?php

namespace Commerce\Controller\Plugin;

use Zend\Mvc\Controller\Plugin\AbstractPlugin;

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

控制器插件不会被注入控制器。
除去

并从ProductController的构造函数中删除第二个参数

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

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

在动作控制器中


    • 控制器插件不会被注入控制器。 除去

      并从ProductController的构造函数中删除第二个参数

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

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

      在动作控制器中


      我使用的是一个基本控制器,我必须通过依赖项注入插件 根据要求。 以上配置很好。我所要做的就是在
      service\u 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);
              }
          ],
      
      ],
      

      我使用的是一个基本控制器,我必须通过依赖项注入插件 根据要求。 以上配置很好。我所要做的就是在
      service\u 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);
              }
          ],
      
      ],
      

      在工厂里你有
      Controller\Plugin\ProductPlugin
      ,你的名字空间是
      Commerce\Controller\Plugin
      +class
      ProductPlugin
      @Edwin我也在工厂里试过
      \Commerce\Controller\Plugin\ProductPlugin::class
      。同样的错误。在工厂里你有
      Controller\Plugin\ProductPlugin
      ,你的名字空间是
      Commerce\Controller\Plugin
      +class
      ProductPlugin
      @Edwin我也在工厂里试过
      \Commerce\Controller\Plugin\ProductPlugin::class
      。同样的错误,谢谢你,简。虽然我使用的是一个基本控制器,并且我必须根据对基本控制器的请求动态地注入插件。但是这样使用插件会使类更难测试。谢谢Jannes。虽然我使用的是一个基本控制器,并且我必须根据对基本控制器的请求动态地注入插件,但这样使用插件会使类更难测试。