【问题标题】:Zend 2 Plugin Manager cant find classZend 2 Plugin Manager 找不到类
【发布时间】:2015-02-13 07:07:25
【问题描述】:

我是 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 并添加了带有命名空间 WebAcl\Controller\Plugin 的 WebAclPlugin.php
  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   ###################################     
    );
    

当我运行它时,我得到:

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

我做错了什么?

编辑:如果我在我的模块中指定它工作的类映射

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

但如果我使用“自动加载”它就不起作用

'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 更新,它将它添加到 auto_namespace。我这样做了,但是当我在我的模块中指定它时需要这样做吗?对不起,如果我的问题被误解了。

【问题讨论】:

    标签: plugins zend-framework2


    【解决方案1】:

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

    你没有说myname\commons\Acl是ZF2模块还是作曲家加载的包。

    如果是composer包,则需要添加:

    "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. 'module_paths'键中添加模块路径:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      相关资源
      最近更新 更多