2011-12-19 56 views
9

我需要在Zend Framework中使用自定義類自定義類2.0。我的自定義庫位於/vendor/Garvey/library/Garvey。我在/vendor/Garvey/library/Garvey/Db/Table/AbstractTable.php一個簡單的擴展AbstractTable類:Zend Framework 2.0中的自動加載自定義庫

<?php 

namespace Garvey\Db\Table; 

use Zend\Db\Table\AbstractTable; 

abstract class AbstractTable extends AbstractTable 
{ 
    public function getItemById($id) 
    { 

    } 
} 

在index.php我有以下代碼:

require_once 'vendor/ZendFramework/library/Zend/Loader/AutoloaderFactory.php'; 
Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array(
    'prefixes' => array(
     'Garvey' => 'vendor/Garvey/library/Garvey', 
    ) 
))); 

但我有以下錯誤。我錯過了什麼?

Fatal error: Class 'Garvey\Db\Table\AbstractTable' not found 

預先感謝您。

+0

什麼?這是錯誤的看[手冊](http://framework.zend.com/manual/en/zend.loader.autoloader.html) – noob 2011-12-19 09:13:39

+0

這是一個Zend Framework 2. Beta1。 – pltvs 2011-12-19 09:16:04

+0

爲什麼使用舊版本...(2分鐘) – noob 2011-12-19 09:23:10

回答

11

你原來的index.php也將工作,如果你改變了「前綴」鍵「命名空間」,並指定路徑如下圖所示:

Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array(
    'namespaces' => array(
     'Garvey' => dirname(__DIR__) . '/vendor/Garvey', 
    ) 
))); 
+2

不錯的答案,只是對這個具體問題稍作修改:''Garvey'=> dirname(__ DIR__)。 '/ vendor/Garvey/library/Garvey'' – Hegemon 2012-03-15 10:05:05

+0

plutov,你不應該需要:require_once'vendor/ZendFramework/library/Zend/Loader/AutoloaderFactory.php'; – 2013-01-09 15:36:32

2

我找到了答案。把這個在您的index.php:

require_once 'vendor/ZendFramework/library/Zend/Loader/StandardAutoloader.php'; 
$loader = new Zend\Loader\StandardAutoloader(); 
$loader->registerNamespace('Garvey', realpath('vendor/Garvey/library/Garvey')); 
$loader->register(); 
+0

這是正確的方法。 – 2012-01-07 03:41:27

+0

嗯有點令人沮喪。你可能是新的,但我更新!以上哪裏去?我在想public/index.php – 2012-01-13 00:00:59

+0

是的,你正確。 index.php – pltvs 2012-01-13 09:06:00

11

或者你可以在Module.php的defime方法

public function getAutoloaderConfig() 
{ 
    $return = array(
     'Zend\Loader\ClassMapAutoloader' => array(
      __DIR__ . '/autoload_classmap.php' 
     ), 
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
       __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
       'Garvey' => __DIR__ . '/../../vendor/Garvey/library/Garvey', 
      ) 
     ) 
    ); 
} 

但我不會推薦它。由於ZF2的目的都是以自動加載速度爲中心,所以最好的方法是使用class_map樣式來加載你的類。它最終會更快地工作,但需要額外的工作。你可以在你的class_map文件中註冊每個類。

您可以在庫的根目錄創建class_map.php並放置有

<?php 
return array(
    'Garvey\Db\Table\AbstractTable' => __DIR__ . '/Garvey/Db/Table/AbstractTable.php', 
); 

而當你使用添加有儘可能多的參加。而在getAutoloaderConfig()您可以添加類映射

public function getAutoloaderConfig() 
{ 
    $return = array(
     'Zend\Loader\ClassMapAutoloader' => array(
      __DIR__ . '/autoload_classmap.php', 
      __DIR__ . '/../../vendor/Garvey/library/Garvey/class_map.php', 
     ), 
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
       __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
      ) 
     ) 
    ); 
} 
+0

在我看來這是最好的答案。使用類映射是Zend推薦的一種快速(如果不是最快的)加載類的方法。它也清晰易記。好的工作清理這個方法,謝謝! – 2015-01-16 20:08:01

3

馬修緯二路O'Phinney解釋this video,現在有三種方法自動加載:

  • ZF1風格的include_path自動加載磁帶機(老ZF1方法,不推薦
  • 每命名空間/前綴自動加載(新ZF2方法,更好
  • Class-map autoloading建議並以最快的

一個class-map generator實用程序中,將採取寫/vendor/vendor_name/library/autoload_classmap.php對你的照顧文檔提及。

您找到的解決方案與Matthew在Per-namespace/prefix autoloading視頻中提到的解決方案類似。按照ZendSkeletonApplication中的代碼結構,該代碼將在/init_autoloader.php文件中,而不是在/public/index.php文件中。

2

快速瀏覽this post

現在下一步是在我們的自定義庫中添加一些代碼。

首先打開一個文件./vendor/Garvey/autoload_classmap.php

return array(

    'Garvey\Module' => __DIR__ . '/Module.php', 

    'Garvey\Db\Table' => __DIR__ . '/library/Garvey/Db/Table/AbstractTable.php', 

) 

接下來是./vendor/Garvey/Module.php

namespace Garvey; 

use Zend\ModuleManager\Feature\AutoloaderProviderInterface; 

class Module implements AutoloaderProviderInterface 
{ 
    public function getAutoloaderConfig() 
    { 
     return array(
      'Zend\Loader\ClassMapAutoloader' => array(
       __DIR__ . '/autoload_classmap.php', 
      ), 

      'Zend\Loader\StandardAutoloader' => array(
       'namespaces' => array(
        __NAMESPACE__ => __DIR__ . '/library/' . __NAMESPACE__, 
       ), 
      ), 
     ); 
    } 
} 

現在裏面你的庫中創建一個文件夾中的文件:

./vendor/Kdecom/library/Kdecom/Db/Table/AbstractTable.php

最後一個我們需要做的事情ich將此庫添加到您的application.config.php文件中。

所以你application.config.php文件將看起來像這樣...

return array(
    'modules' => array(
     'Application', 
     'Garvey' 
    ), 

    'module_listener_options' => array(
     'config_glob_paths' => array(
      'config/autoload/{,*.}{global,local}.php', 
     ), 

     'module_paths' => array(
      './module', 
      './vendor', 
     ), 
    ), 
); 
+0

帖子鏈接返回404 – 2014-10-22 17:11:03