我是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
答案 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;