2012-01-11 17 views
8

Zend Frameworkの名前空間に苦労しています(少なくとも名前空間の問題だと思います)。Zend AutoloaderにPHPExcelクラスが見つかりません

私はZendプロジェクトにPHPExcelを統合したいと思っています。

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

カスタムクラスは正常に動作し、ブートストラップで

Zend_Loader_Autoloader::getInstance()->registerNamespace('ABCD_'); 

た後、次のように関連するファイル構造です。また、これらのクラスはすべてABCD_blahdeblahという名前です。

しかし、registerNamespace( 'PHPExcel_')を実行しても、Zendは適切なクラスを見つけるのに役立ちません。私が試してみると、コントローラーのコントローラには

$sheet = new PHPExcel; 

が表示されますが、「クラスが見つかりません」というエラーが表示されます。これは、PHPExcelのクラスに名前空間接頭辞が付けられていないか、メインのPHPExcel.phpファイルが私が宣言した名前空間の外にあるためです。しかし、PHPExcel構造は、それがクラス/フォント/ etcファイルの残りの親ディレクトリにあることを要求します。

いずれのポインタも大歓迎です。

ありがとうございます。

+0

PHPExcelは他のクラスを使用していますか?クラスの名前を 'My_PHPExcel'または' App_PHPExcel'に変更することはできませんし、すべてをそれぞれのディレクトリに入れますか? – bububaba

+0

それはボートで他のクラスを使用します。それはかなりリファクタリングの仕事だろう。現時点では、コントローラで「include_once」を使用しています。理想的ではありませんが、働いています。 – yycroman

答えて

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をインスタンス化することができるはず - で、言いますコントローラ - シンプル:

唯一の厄介な部分は、PHPExcelがどのようにしてそれ自身のフォルダ内のすべての依存関係を読み込むのかということです。 require_once basename(__FILE__) . '/someFile.php'のような呼び出しや、Zendのオートローダーのなかで何らかの形で取得できない独自のオートローダーを使用すると、すべてがすばらしくなるはずです。 #famouslastwords

+0

期待どおりに動作します - 今は他のライブラリでもそれを行う方法を知っています。ありがとうございます! – yycroman

+1

私の喜び。私が最終的にこれを理解したら、PSR-0以外のライブラリを統合するためのまったく新しい世界が開かれました。乾杯! –

+0

非常に役に立ちます。カスタムクラスに最適 –

1

はPHPExcelオートローダを変更してみてください。

はすぐ

前に、/Classes/PHPExcel/Autoloader.phpでレジスタ()メソッドの最初の二行として

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

を追加します。

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

私はexel-librare(phpxls)とpdf-library(fpdf)の両方で同様の問題を抱えていましたが、いくつかの試みの後に私はちょうど必要なファイルをライブラリを手動で作成し、そこから移動します。ブースphpxlsとfdpdは、zend autoloaderメソッドに干渉することなく他のすべてを処理できます。

psudo_codeの例は、私が目的のクラスのオブジェクトを返した後、それを使って作業を続けられるようなものです。あなたは、コンシューマに物を含めることを選択してオフコアすることができます。

<?php 
    class exelClass{ 

     public function exelFunction(){ 

      require_once 'required_file.php'; 

      $exelObject = new exelObject(); 

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

このソリューションは、エレガントな、しかし、私はそれがお互いにinterfearing differnetのオートローダーや魔法機能せずに共存するためのライブラリの種類を有効にする最も簡単な方法であることがわかったということではないかもしれません。

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(); 
関連する問題