2013-06-18 84 views
1

我對Zend Framework 2非常陌生,並且正在使用Michael Romer的書籍「Web Development with Zend Framework 2」作爲我的指導。我在第5章的末尾介紹了ClassMapAutoloader的主題。討論的結論是,我的Helloworld模塊現在擁有的文件和目錄結構 - >Zend Framework 2 ClassMapAutoloader錯誤

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 

至於我可以告訴大家,設置自動加載類映射是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 - >

<?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致命錯誤:未捕獲的異常'Zend \ Loader \ Exception \ InvalidArgumentException'消息提供的Map文件不會返回地圖。映射文件:/var/www/ZendApp/vendor/zendframework/zendframework/library/Zend/Loader/ClassMapAutoloader.php:88\nStack trace:「/var/www/ZendApp/module/Helloworld/autoload_classmap.php」。 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-> registerAutoloadMaps(Array)\ n#2/var/www/ZendApp/vendor/zendframework/zendframework/library/Zend/Loader/ClassMapAutoloader.php(46):Zend \ Loader \ ClassMapAutoloader-> setOptions(Array)\ n#3/var/www/ZendApp/vendor/zendframework/zendframework/library /Zend/Loader/AutoloaderFactory.php(100):Zend \ Loader \ ClassMapAutoloader - > __ construct(Array)\ n#4/var/www/ZendApp/vendor/zendframework/zendframework/library/Zend/M in/var/www/ZendApp /供應商/ zendframework/zendframework /庫/ Zend的/裝載機/ ClassMapAutoloade在線88 r.php

我知道,返回空白數組會導致Module.php的Module類中的getAutoloaderConfig()默認爲StandardAutoloader,因此它的工作原理是什麼?在這個例子中,我真的很想讓ClassMapAutoloader完成它的工作。我如何得到這個工作?預先感謝您的回覆。

詹姆斯·伊士曼

+0

有什麼錯誤?您可以複製/粘貼 –

+0

埃迪,Woopsie,忘記了錯誤。我編輯了我原來的帖子,現在收錄了。謝謝您的幫助。 –

回答

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 

此作品在您加載Zend框架2與作曲家,它加載在vendor/目錄庫的情況。

+0

啊......我明白了。所述autoload_classmap.php會從由../../vendor/zendframework/zendframework/bin/classmap_generator.php -w命令行生成。然後,它使得生成到我的模塊有用autoload_classmap.php文件autoload_function.php和autoload_register.php。 –

+0

@JamesEastman正確:) –

0

在Module.php後面加上兩行代碼!

namespace Helloworld; 

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