Zend Framework 2 ClassMapAutoloader错误

时间:2013-06-18 21:52:36

标签: zend-framework2

我是Zend Framework 2的新手,我正在使用Michael Romer的“Web开发与Zend Framework 2”这本书作为我的向导。我在第5章的末尾,介绍了ClassMapAutoloader的主题。讨论的结论是我的Helloworld模块现在具有 - >

的文件和目录结构
Module.php
autoload_classmap.php
autoload_function.php
autoload_register.php
config/
     module.config.php
public/
     images/
     css/
     js/
src/
     Helloworld/
          Controller/
                   IndexController.php
views/
     Helloworld/
             Index/
                 index.phtml

据我所知,设置Classmap自动加载的文件是Module.php,autoload_classmap.php,autoload_function.php,autoload_register.php。这些文件的内容是

Module.php - >

<?php

 namespace Helloworld;

 Class Module {

 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';

 }

 }

autoload_function.php - &gt;

<?php

return function ($class) {

 static $classmap = null;
 if ($classmap === null) {

      $classmap = include __DIR_ . '/autoload_classmap.php';

 }
 if (!isset($classmap[$class])) {

      return false;

 }

 return include_once $classmap[$class];

};

autoload_register.php - &gt;

<?php

spl_autoload_register(include __DIR__  . '/autoload_function.php');

autoload_classmap.php - &gt;

<?php

//require_once 'autoload_register.php';

return array();

当我在autoload_classmap.php中返回空白数组时,这一切都有效但在本书中示例中有require_once&#39; autoload_register.php&#39;;当我取消注释该行时,我收到以下错误 - &gt;

错误是 - &gt; [Tue Jun 18 16:29:20 2013] [错误] [client 199.82.163.121] PHP致命错误:未捕获异常&#39; Zend \ Loader \ Exception \ InvalidArgumentException&#39;提供消息&#39;提供的地图文件不会返回地图。地图文件:&#34; /var/www/ZendApp/module/Helloworld/autoload_classmap.php"&#39;在/var/www/ZendApp/vendor/zendframework/zendframework/library/Zend/Loader/ClassMapAutoloader.php:88\nStack trace:\ n#0 / var / www / ZendApp / vendor / zendframework / zendframework / library / Zend / Loader / ClassMapAutoloader.php(117):Zend \ Loader \ ClassMapAutoloader-&gt; registerAutoloadMap(&#39; / var / www / ZendAp ...&#39;)\ n#1 / var / www / ZendApp / vendor / zendframework / zendframework / library / Zend / Loader / ClassMapAutoloader.php(60):Zend \ Loader \ ClassMapAutoloader-&gt; registerAutoloadMaps(Array)\ n#2 / var / www / ZendApp / vendor / zendframework / zendframework / library / Zend / Loader / ClassMapAutoloader.php(46):Zend \ Loader \ ClassMapAutoloader-&gt; setOptions(Array)\ n#3 /var/www/ZendApp/vendor/zendframework/zendframework/library/Zend/Loader/AutoloaderFactory.php(100) :Zend \ Loader \ ClassMapAutoloader-&gt; __ construct(Array)\ n#4 / var / www / ZendApp / vendor / zendframework / zendframework / library / Zend / M in / var / www / ZendApp / vendor / zendframework / zendframework / library第88行/Zend/Loader/ClassMapAutoloader.php

我知道返回空白数组会导致Module.php的Module类中的getAutoloaderConfig()默认为StandardAutoloader,因此它可以工作,但为什么呢?我真的很想让ClassMapAutoloader在这个例子中做它的事情。我如何让它工作?在此先感谢您的回复。

James Eastman

2 个答案:

答案 0 :(得分:3)

在类图文件中不需要自动加载器寄存器功能。那是not even in the books

您可以使用Zend Framework 2中提供的classmap generator生成自动加载器类映射。您可以生成autoload_classmap.php文件,以便填充模块中的所有php类。

用法:

$ cd module/MyModule
$ ../../vendor/zendframework/zendframework/bin/classmap_generator.php -w

这适用于使用composer加载Zend Framework 2的情况,它将库加载到vendor/目录中。

答案 1 :(得分:0)

在Module.php之后添加两行代码!

namespace Helloworld; 

    use Zend\Mvc\ModuleRouteListener;
    use Zend\Mvc\MvcEvent;