2011-11-06 116 views
3

試圖讓我的腳在ZF2上變得潮溼,我偶然發現了我的第一個問題。假設一個模塊上我想用Shanty_Mongo(外部庫連接到MongoDB中)Zend Framework 2庫路徑

所以,我複製磁帶庫的整個棚戶目錄並創建了一個新的模型類:

namespace Dummy\Model; 

use Shanty\Mongo\Document; 

class Dummy extends Shanty_Mongo_Document { 
    public function setConnections($connections) { 
    Shanty_Mongo::addConnections($connections); 
    } 
} 

(該如果我已經理解了,setConnections()將被DI使用)

這似乎無法找到Shanty_Mongo_Document。我應該添加一些東西到application.config.php指向額外的庫?

+0

嘗試'使用Shanty \ Mongo \ Document作爲文檔',然後'class Dummy extends Document'。我對這些命名空間並不太堅定,但是如果我理解正確,它應該像那樣工作 – Sam

+0

不幸的是,它不起作用。實際上,Shanty_Mongo遵循Zend爲它的庫強制執行的目錄命名轉換,但我想它不起作用,因爲它不支持命名空間。我試圖弄清楚如何使它工作(http://packages.zendframework.com/docs/latest/manual/en/zend.loader.html#zend.loader.load) – mobius

回答

4

Shanty_Mongo是一個「舊」下劃線分隔的庫,不使用名稱空間。在ZF2中,風格與PSR-0標準相同,但具有命名空間(因此Shanty_Mongo將爲Shanty\Mongo)。但是,例如,您可以使用類圖加載這些舊式樣。然後你可以在你的ZF2項目中使用下劃線分隔的類。

我建議你爲這個庫創建一個模塊,並把該模塊放在./vendor(「提供第三方功能的模塊」)。在這個模塊中,可以創建以下目錄結構(我假設模塊的名稱是ShantyMongo):

./vendor/ShantyMongo/ 
    library/ 
    Module.php 
    autoload_classmap.php 
    autoload_function.php 
    autoload_register.php 

圖書館是一個子模塊的ShantyMongo git倉庫。文件autoload_classmap.php是由ZF2存儲庫的bin目錄內的php腳本classmap_generator.php創建的類映射。然後autoload_function.php可以像這樣簡單的東西:

<?php 
return function ($class) { 
    static $map; 
    if (!$map) { 
     $map = include __DIR__ . '/autoload_classmap.php'; 
    } 

    if (!isset($map[$class])) { 
     return false; 
    } 
    return include $map[$class]; 
}; 

而且autoload_register.php是這樣的:

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

要讓ZF2應用程序知道你有這個模塊,您需要填寫module.php與ShantyMongo\Module類。這樣的事情應該是足夠了:

<?php 

namespace ShantyMongo; 

use Zend\Module\Consumer\AutoloaderProvider; 

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

如果添加「ShantyMongo」在application.config.php你的模塊陣列現在已經設置了自動加載機的內部ZF2這個第三方庫。然後,您可以如下使用您的模型:

<?php 

namespace Dummy\Model; 

class Dummy extends Shanty_Mongo_Document { 
    public function setConnections ($connections) { 
    Shanty_Mongo::addConnections($connections); 
    } 
} 

因爲ShantyMongo不使用名稱空間,所以您不再使用該語句。