2012-01-11 55 views
8

我在Zend Framework中掙扎着命名空間(至少我認爲這是一個命名空間問題)。在Zend自動加載器中找不到PHPExcel類

我想將PHPExcel集成到我的Zend項目中。相關文件結構如下:

/ 
-library 
    -ABCD 
    -PHPExcel 
    -Zend 
    -ZendX 
    -PHPExcel.php 

自定義類做工精細,後

Zend_Loader_Autoloader::getInstance()->registerNamespace('ABCD_'); 
在引導

。另外,這些課程都是以ABCD_blahdeblah命名的。

但是,使用registerNamespace('PHPExcel_')並不能幫助Zend找到合適的類。當我嘗試

$sheet = new PHPExcel; 

在控制器中,我收到「Class not found」錯誤。我猜測這是因爲PHPExcel中的類沒有用命名空間前綴命名,或者是因爲主PHPExcel.php文件位於我剛剛聲明的命名空間之外。但PHPExcel結構要求它位於類/字體/ etc文件其餘部分的父目錄中。

任何指針將不勝感激。

在此先感謝。

+0

不PHPExcel使用其他類?是不可能將該類重命名爲「My_PHPExcel」或「App_PHPExcel」並將所有內容都放入相應的目錄中? – bububaba 2012-01-11 08:59:50

+0

它使用其他類,由boatful。這將是一個相當重構的工作。目前,我只是在控制器中使用「include_once」這並不理想,但工作。 – yycroman 2012-01-11 09:07:28

回答

10

爲PHPExcel創建自動加載器並將其添加到Zend自動加載器堆棧。

library/My/Loader/Autoloader/PHPExcel.php

class My_Loader_Autoloader_PHPExcel implements Zend_Loader_Autoloader_Interface 
{ 
    public function autoload($class) 
    { 
     if ('PHPExcel' != $class){ 
      return false; 
     } 
     require_once 'PHPExcel.php'; 
     return $class; 
    } 
} 

而且在application/configs/application.ini

autoloadernamespaces[] = "My_" 

然後,在application/Bootstrap.php

protected function _initAutoloading() 
{ 
    $autoloader = Zend_Loader_Autoloader::getInstance(); 
    $autoloader->pushAutoloader(new My_Loader_Autoloader_PHPExcel()); 
} 

那麼你應該能夠實例PHPExcel - 比如說,在控制器 - 用一個簡單的:

$excel = new PHPExcel(); 

唯一粘性部分就是所有這些是PHPExcel如何處理將其所有依賴關係加載到其自己的文件夾中。如果這是智能完成的 - 無論是像require_once basename(__FILE__) . '/someFile.php'這樣的調用,還是用自己的自動加載器,它們都不會妨礙Zend自動加載器 - 那麼一切都應該很酷。 #famouslastwords

+0

正如預期的那樣工作 - 現在我知道如何爲其他圖書館工作,謝謝! – yycroman 2012-01-12 13:19:22

+1

我的榮幸。當我終於明白了這一點時,它爲整合非PSR-0庫開闢了一個全新的世界,就像我處理的許多遺留代碼一樣。乾杯! – 2012-01-12 13:29:26

+0

非常有幫助。非常適合定製課程 – 2012-01-14 14:55:42

1

嘗試修改PHPExcel自動裝載機:

添加

if (function_exists('__autoload')) { 
     spl_autoload_register('__autoload'); 
    } 

在/Classes/PHPExcel/Autoloader.php登記冊()方法的前兩行,立即

之前
return spl_autoload_register(array('PHPExcel_Autoloader', 'Load')); 
0

我有一個exel-librare(phpxls)和pdf-library(fpdf)的類似問題,經過一些不同的嘗試,我剛剛解決了包括所需的文件庫手動並從那裏去。然後,展臺phpxls和fdpd可以處理所有其他事情,而不會干擾Zend自動加載器的方法。

一個psudo_code例子是這樣的,我在那裏返回所需的類的對象,然後可以繼續與合作。你可以選擇將事情包含在構造函數中並從中構建。

<?php 
    class exelClass{ 

     public function exelFunction(){ 

      require_once 'required_file.php'; 

      $exelObject = new exelObject(); 

      return $exelObject->Output(); 
     } 
    } 
    ?> 

這種解決方案可能不是那麼優雅,但我發現它是使不同類型的圖書館,以最簡單的方式,而不目前存在的自動加載磁帶機或神奇功能相互interfearing共存。

4

如今的作曲家是一個經常使用的工具,它是不那麼受歡迎早在2012年建於ZF1可以利用作曲家和自動加載機的更老的項目。

如何獲得全部您的圖書館工作時無需將定製自動加載器添加到您的application.ini每次?

。利用作曲家的自動加載

首先,先從setting up composer.json。創建後,運行composer install以收集所有必需的軟件包並創建作曲家的自動加載器。

現在,讓我們更新您的項目的public/index.php。從現在開始,通過作曲家加載的所有需求都將自動加載。

<?php 

// Define path to application directory 
defined('APPLICATION_PATH') 
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 

// Define application environment 
defined('APPLICATION_ENV') 
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development')); 

// Include composer autoloader 
require_once __DIR__ . '/../vendor/autoload.php'; 

/** Zend_Application */ 
require_once 'Zend/Application.php'; 

// Create application, bootstrap, and run 
$application = new Zend_Application(
    APPLICATION_ENV, 
    array('config' => APPLICATION_PATH . '/configs/application.ini') 
); 

$application->bootstrap(); 
$application->run();