1

我对 Zend Framework 2 非常陌生,并且正在使用 Michael Romer 的“Web Development with 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。这些文件的内容是

模块.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 ->

<?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 ->

<?php

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

autoload_classmap.php ->

<?php

//require_once 'autoload_register.php';

return array();

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

错误是-> [Tue Jun 18 16:29:20 2013] [error] [client 199.82.163.121] PHP Fatal error: Uncaught exception 'Zend\Loader\Exception\InvalidArgumentException' with message 'Map file provided does not return a地图。映射文件:“/var/www/ZendApp/module/Helloworld/autoload_classmap.php”在 /var/www/ZendApp/vendor/zendframework/zendframework/library/Zend/Loader/ClassMapAutoloader.php:88\n堆栈跟踪:\ n#0 /var/www/ZendApp/vendor/zendframework/zendframework/library/Zend/Loader/ClassMapAutoloader.php(117): Zend\Loader\ClassMapAutoloader->registerAutoloadMap('/var/www/ZendAp...') \n#1 /var/www/ZendApp/vendor/zendframework/zendframework/library/Zend/Loader/ClassMapAutoloader.php(60): Zend\Loader\ClassMapAutoloader->

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

詹姆斯伊士曼

4

2 回答 2

3

在类映射文件中没有要求自动加载器注册功能这样的事情。那甚至在书中也没有

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

用法:

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

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

于 2013-06-19T08:00:25.727 回答
0

在 Module.php 名​​称后添加两行代码!

namespace Helloworld; 

    use Zend\Mvc\ModuleRouteListener;
    use Zend\Mvc\MvcEvent;
于 2013-12-10T12:55:42.213 回答