日志未經(jīng)聲明,均為AlloVince原創(chuàng)。版權采用『 知識共享署名-非商業(yè)性使用 2.5 許可協(xié)議』進行許可。
Zend Framework 2.0的自動加載機制主要基于PSR-0標準,引入新的第三方庫只需要注冊新的命名空間即可。
比如加載ZendOAuth模塊,下載后放于vendor/ZendOAuth,然后在依賴的模塊Module.php中加入一行即可:
public function getAutoloaderConfig(){ return array( 'Zend\Loader\StandardAutoloader' => array( 'namespaces' => array( 'ZendOAuth' => __DIR__ . '/../../vendor/ZendOAuth/library/ZendOAuth', __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, ), ), );}
不過由于第三方庫質(zhì)量參差不齊,并不一定所有的庫都遵循PSR-0標準,ZF2也提供了非PSR-0標準庫的自動加載方式,可以在Zend\Loader中新增ClassMapAutoloader,以鍵值對的形式引入需要加載的第三方庫文件。下面以一個正好碰到的實例說明:
項目中正好有一個簡單的需求,要根據(jù)用戶IP顯示用戶所在地,IP來源可能是全球范圍,所以需要找一個IP與地理位置對應的數(shù)據(jù)庫:GeoIP
GeoIP數(shù)據(jù)庫由MaxMind公司負責維護,免費版可以獲得精確到城市一級的IP與地理位置對應數(shù)據(jù),對于一般的應用來說已經(jīng)夠用了。
首先需要下載GeoIP數(shù)據(jù)庫,選擇Binary GeoLite City版,同時還需要下載PHP GeoIP數(shù)據(jù)庫接口,為了更好的兼容性選擇了純php版本的GeoIP接口
最后項目中這樣放置:
project/--data/----GeoLiteCity.dat--module/----MyModule/------Module.php------vendor/--------GeoIP/----------geoip.inc----------geoipcity.inc----------geoipregionvars.php
在模塊Module.php中首先引入ClassMapAutoloader,并在同目錄下放置一個autoload_classmap.php文件
public function getAutoloaderConfig(){ return array( 'Zend\Loader\ClassMapAutoloader' => array( __DIR__ . '/autoload_classmap.php', ), 'Zend\Loader\StandardAutoloader' => array( 'namespaces' => array( __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, ), ), );}
在autoload_classmap.php文件中需要制定第三方庫文件的位置
<?phpreturn array( 'GeoIP' => __DIR__ . '/vendor/GeoIP/geoipcity.inc',);
最后在模塊Controller中就可以通過自動加載機制直接使用:
public function geoAction(){ $city = 'unkown'; $geoData = __DIR__ . '/../../../../../data/databases/GeoLiteCity.dat'; new \GeoIP(); $ip = $_SERVER['REMOTE_ADDR']; $gi = geoip_open($geoData, GEOIP_STANDARD); $record = geoip_record_by_addr($gi, $ip); if(isset($record->city)){ $city = $record->city; } geoip_close($gi); return array( 'city' => $city );}
以下劃線作為類名分隔符也很常見,這一種類庫的加載在ZF2中仍然使用StandardAutoloader,不過需要指定的不是Namespaces而是Prefixes,比如加載PHP-Resque這個項目,在Module.php中加入:
public function getAutoloaderConfig(){ return array( 'Zend\Loader\ClassMapAutoloader' => array( __DIR__ . '/autoload_classmap.php', ), 'Zend\Loader\StandardAutoloader' => array( 'prefixes' => array( 'Resque' => __DIR__ . '/../../vendor/Resque/lib/Resque', ), ), );}
同時在autoload_classmap中加入
return array( 'Resque' => __DIR__ . '/../../vendor/Resque/lib/Resque.php',);
即可。
聯(lián)系客服