Zend 2插件管理器无法找到课程

时间:2014-12-15 08:12:31

标签: plugins zend-framework2

我是Zend 2的新手,正在尝试将我的Zend 1项目迁移到Zend 2.我的Zend 1项目中有一个Acl插件,我使用符号链接与几个应用程序共享。我现在想到我迁移到Zend 2我在Vendor文件夹中创建了自己的包。我下载了Skeleton项目并尝试添加我的插件:

    在供应商文件夹中
  1. 我创建了myname \ commons \ Acl并添加了我的Module.php
  2. 在myname \ commons \ Acl中我创建了src \ WebAcl \ Controller \ Plugin以及添加了WebAclPlugin.php,其名称空间为WebAcl \ Controller \ Plugin
  3. 在我的myname \ commons \ Acl中,我创建了./config并添加了带有内容的module.config.php

    return array(
        // added for Acl   ###################################
    '   controller_plugins' => array(
            'invokables' => array(
            'WebAclPlugin' => 'WebAcl\Controller\Plugin\WebAclPlugin',
           )
        ),
    // end: added for Acl   ###################################     
    );
    
  4. 当我跑步时,我得到:

    致命错误:类' WebAcl \ Controller \ Plugin \ WebAclPlugin'在第170行的AbstractPluginManager.php中找不到

    我做错了什么?

    编辑:如果我在我的模块中指定了它可以运行的类图

    'Zend\Loader\ClassMapAutoloader' => array(
         __DIR__ . '/autoload_classmap.php',
     )
    

    但如果我使用" autoload"它不起作用

    'Zend\Loader\StandardAutoloader' => array(
        'namespaces' => array(
             __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
         ),
     ),
    

    编辑2:这解决了问题:

    'Zend\Loader\StandardAutoloader' => array(
        'namespaces' => array(
             __NAMESPACE__ => __DIR__ . '/src/' *.str_replace("\\", "/", __NAMESPACE__),*
         ),
     ),
    

    还是我想弄清楚composer.phar实际上做了什么?请参阅其他问题:

    其他问题:我读到我应该在composer.json中添加我的命名空间并运行composer.phar update,它会将其添加到auto_namespace。我这样做了,但是当我在模块中指定它时,是否需要?对不起,如果我的问题被愚弄了。

1 个答案:

答案 0 :(得分:0)

插件管理器将尝试使用new加载该类,这将使注册的自动加载器尝试加载该类。如果没有可以加载此类的自动加载器,那么您将收到致命错误。

如果myname\commons\Acl是ZF2模块或作曲家加载的包,你就不会说。

如果它是作曲家包,那么你需要添加:

"autoload": {
    "psr-4": {
        "WebAcl\\": "myname/commons/Acl/src/WebAcl"
    }
}

composer.json,然后运行composer.phar dumpautoload

如果您希望myname / commons / Acl成为模块,则需要将Module.php添加到myname/commons/Acl,如下所示:

<?php

namespace WebAcl;

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

您现在需要告诉您的应用程序ModuleManagerapplication.config.php中加载此模块:

  1. 'WebAcl'添加到'modules'
  2. 列表中
  3. 'module_paths'键中添加模块的路径:

    'module_paths' => array(
        'WebAcl' => "./vendor/myname/commons/Acl",
        './module',
        './vendor',
    ),
    

    您必须这样做,因为没有像命名空间名称(WebApi)直接映射到磁盘上的路径名,就像./modules目录中一样。

  4. ModuleManager现在应该找到您的模块,自动加载器应该能够在vendor/myname/commons/Acl/src/WebApi内的WebAcl名称空间中自动加载任何文件。

    当然,如果您不需要ZF2模块的任何其他功能,作曲家路线会更容易。