Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 插件在控制器中不工作_Php_Zend Framework2 - Fatal编程技术网

Php 插件在控制器中不工作

Php 插件在控制器中不工作,php,zend-framework2,Php,Zend Framework2,我正在使用骨架教程构建我的第一个Zend Framework 2应用程序。但每当我尝试从任何控制器调用任何插件时,都会收到错误消息: 在插件管理器中找不到名为“plugin\u name”的插件 Zend\Mvc\Controller\PluginManager 不幸的是,我不知道代码的哪一部分可以帮助您帮助我。我发布了一些我认为可能很重要的文件 config/modules.config return [ 'Zend\Router', 'Zend\Validator',

我正在使用骨架教程构建我的第一个Zend Framework 2应用程序。但每当我尝试从任何控制器调用任何插件时,都会收到错误消息:

在插件管理器中找不到名为“plugin\u name”的插件 Zend\Mvc\Controller\PluginManager

不幸的是,我不知道代码的哪一部分可以帮助您帮助我。我发布了一些我认为可能很重要的文件

config/modules.config

return [
    'Zend\Router',
    'Zend\Validator',
    'Zend\Form',
    'Album',
    'Application',
    'User',
];
module/User/src/module.php

<?php

namespace User;

use User\Model\User;
use User\Model\UserTable;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;

class Module
{
    const VERSION = '1.0.0dev';

    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\ClassMapAutoloader' => array(
                __DIR__ . '/autoload_classmap.php',
            ),
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                ),
            ),
        );
    }

    public function getConfig()
    {
        return include __DIR__ . '/../config/module.config.php';
    }

    public function getServiceConfig()
    {
        return array(
            'factories' => array(
                'User\Model\UserTable' =>  function($sm) {
                    $tableGateway = $sm->get('UserTableGateway');
                    $table = new UserTable($tableGateway);
                    return $table;
                },
                'UserTableGateway' => function ($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new User());
                    return new TableGateway('user', $dbAdapter, null, $resultSetPrototype);
                },
            ),
        );
    }
}
<?php

namespace User;

use Zend\ServiceManager\Factory\InvokableFactory;
use Zend\Router\Http\Segment;

return [
    'controllers' => [
        'factories' => [
            Controller\UserController::class => InvokableFactory::class,
        ],
        'invokables' => [
            'User\Controller\User' => 'User\Controller\UserController',
        ],
    ],

    'router' => [
        'routes' => [
            'user' => [
                'type'    => Segment::class,
                'options' => [
                    'route'    => '/user[/:action[/:id]]',
                    'constraints' => [
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id'     => '[0-9]+',
                    ],
                    'defaults' => [
                        'controller' => Controller\UserController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
        ],
    ],

    'view_manager' => [
        'template_path_stack' => [
            'user' => __DIR__ . '/../view',
        ],
    ],
];
因为我真的需要服务定位器,所以我找到了一个变通方法,我认为这不是很好,但对我来说很有效:

$sm = $this->getEvent()->getApplication()->getServiceManager();
但我想这里有点不对劲

编辑:

为了更好地再现我所做的(我再次安装了Zend Framework,但它仍然会给我相同的错误):

  • 通过本安装指南()安装了Zend Framework(我想是2.4?)。我使用以下命令安装了它:

    编写器创建项目-sdev--存储库url=”https://packages.zendframework.com“zendframework/skeleton应用程序

  • 在安装过程中,当有人问我是否要安装最低安装量时,我选择了“否”。接下来的每个问题我都回答“是”(安装程序要求安装很多模块,我都安装了)

  • 安装程序询问我要在哪个配置中注入“ZendDeveloperTools”。我回答了2(config/development.config.php.dist)。对于所有其他的,我选择了1(config/modules.config.php)
  • 我通过在浏览器中调用url来测试框架应用程序,它成功了
  • 我在这里()从GitHub下载了相册模块
  • 我已将相册模块复制到我的模块文件夹中
  • 我在config/modules.config.php文件中添加了“Album”条目
  • 我浏览到相册页面
  • 我得到了一个错误:
  • 在插件中未找到名为“getServiceLocator”的插件 manager Zend\Mvc\Controller\PluginManager

    我假设此错误的原因是AlbumController中的getAlbumTable()方法

    public function getAlbumTable()
    {
        if (!$this->albumTable) {
            $sm = $this->getServiceLocator();
            $this->albumTable = $sm->get('Album\Model\AlbumTable');
        }
        return $this->albumTable;
    }
    
    在中,您可以看到控制器必须实现以下方法:
    setPluginManager
    getPluginManager
    plugin
    。你也可以阅读:

    为了更方便起见,
    AbstractActionController
    AbstractActionController
    都有
    \u call()
    实现,允许您通过方法调用检索插件:

    $plugin=$this->url()

    您的控制器是否扩展了
    AbstractActionController
    AbstractActionController

    如果是,它应该按照文档中提到的那样工作(因此您在问题中提到的那些方法应该可以工作)。 由于您没有共享任何控制器代码,因此很难说这是否是问题所在


    更新 您得到的错误与
    ControllerPluginManager
    的配置无关,但您得到此错误是因为您正在执行以下操作:

    $sm = $this->getServiceLocator();
    
    由于方法
    getServiceLocator
    不存在,因此会执行magic
    \u call()
    方法,从而导致错误

    这是因为在最新版本的ZF2中,控制器类不再具有“服务定位器感知”功能,这意味着您无法通过调用
    $This->getServiceLocator()
    来检索
    ServiceManager

    相反,您必须将
    Album\Model\AlbumTable
    服务注入工厂内的控制器类:

    1)向控制器类添加构造函数方法:

    public function __construct(AlbumTable $albumTable){
        $this->albumTable = $albumTable;
    }
    
    2)为控制器创建工厂:

    <?php
    namespace Album\Controller\Factory;
    
    use Album\Controller\AlbumController;
    
    class AlbumControllerFactory implements FactoryInterface
    {
        /**
         * @param  ServiceLocatorInterface $serviceLocator
         * @return AlbumController
         */
        public function createService(ServiceLocatorInterface $serviceLocator)
        {
            $controllerPluginManager = $serviceLocator;
            $serviceManager = $controllerPluginManager->get('ServiceManager');
            $albumTable = $serviceManager->get('Album\Model\AlbumTable');
            return new  AlbumController($albumTable);
        }
    }
    
    在中,您可以看到控制器必须实现以下方法:
    setPluginManager
    getPluginManager
    plugin
    。你也可以阅读:

    为了更方便起见,
    AbstractActionController
    AbstractActionController
    都有
    \u call()
    实现,允许您通过方法调用检索插件:

    $plugin=$this->url()

    您的控制器是否扩展了
    AbstractActionController
    AbstractActionController

    如果是,它应该按照文档中提到的那样工作(因此您在问题中提到的那些方法应该可以工作)。 由于您没有共享任何控制器代码,因此很难说这是否是问题所在


    更新 您得到的错误与
    ControllerPluginManager
    的配置无关,但您得到此错误是因为您正在执行以下操作:

    $sm = $this->getServiceLocator();
    
    由于方法
    getServiceLocator
    不存在,因此会执行magic
    \u call()
    方法,从而导致错误

    这是因为在最新版本的ZF2中,控制器类不再具有“服务定位器感知”功能,这意味着您无法通过调用
    $This->getServiceLocator()
    来检索
    ServiceManager

    相反,您必须将
    Album\Model\AlbumTable
    服务注入工厂内的控制器类:

    1)向控制器类添加构造函数方法:

    public function __construct(AlbumTable $albumTable){
        $this->albumTable = $albumTable;
    }
    
    2)为控制器创建工厂:

    <?php
    namespace Album\Controller\Factory;
    
    use Album\Controller\AlbumController;
    
    class AlbumControllerFactory implements FactoryInterface
    {
        /**
         * @param  ServiceLocatorInterface $serviceLocator
         * @return AlbumController
         */
        public function createService(ServiceLocatorInterface $serviceLocator)
        {
            $controllerPluginManager = $serviceLocator;
            $serviceManager = $controllerPluginManager->get('ServiceManager');
            $albumTable = $serviceManager->get('Album\Model\AlbumTable');
            return new  AlbumController($albumTable);
        }
    }
    

    函数
    getAlbumTable()
    在ZF2教程中使用,但在ZF3中被成员
    table
    替换

    AlbumController.php
    中的
    deleteAction()
    函数更改为:

    公共函数deleteAction()
    {
    $id=(int)$this->params()->fromRoute('id',0);
    如果(!$id){
    返回$this->redirect()->toRoute('album');
    }
    $request=$this->getRequest();
    如果($request->isPost()){
    $del=$request->getPost('del','No');
    如果($del=='Yes'){
    $id=(int)$request->getPost('id');
    $this->table->deleteAlbum($id);
    }
    //重定向到相册列表
    返回