CakePHPでPEARのパッケージを使う方法イロイロ

CakePHPPEARのパッケージを利用したいと思って調べてみると、やり方が人それぞれバラバラだったりするが、次の3種類に大別できるんじゃないかと。

  • ディレクトリ Vendorsに格納して、「App::import()」で呼び出す
  • CakePHPとは無関係なPEAR格納用ディレクトリを指定して、「App::import()」で呼び出す
  • include(あるいはrequire)で呼び出す

次のコードではPEARのText_Wikiパッケージを呼び出している。アクション・index1ではrequireでPEARのフォルダを参照し、index2では「app/vendors」に格納したText_Wikiパッケージを参照させている。Text_WikiWiki記法のパーサです。

<?php
class TestsController extends AppController {

    var $name = 'Tests';
    var $autoRender = false;
    var $uses = array();
    

    function index1() {
	    require_once('D:\xampp\php\PEAR\Text\Wiki.php');
	    $wiki=new Text_Wiki();

	    // Configuration
	    $wiki->deleteRule( 'Wikilink' ); // remove a rule for auto-linking
	    $wiki->setFormatConf( 'Xhtml' , 'translate' , false ) ; // remove HTML_ENTITIES

	    $text="* 日本語";

	    echo $wiki->transform($text,'xhtml');    
    }
    
    function index2() {
    	App::import('Vendor', 'Text/Wiki');
	    $wiki=new Text_Wiki();

	    // Configuration
	    $wiki->deleteRule( 'Wikilink' ); // remove a rule for auto-linking
	    $wiki->setFormatConf( 'Xhtml' , 'translate' , false ) ; // remove HTML_ENTITIES

	    $text="* 日本語";

	    echo $wiki->transform($text,'xhtml');    
    }
    
}
?>

言うまでもなくだけど、index1とindex2は同じ結果を返す。

<ul>
    <li>日本語</li>
</ul>

手元にあるCakePHP(Pocket詳解 CakePHP辞典)のリファレンスによれば、次のようにある。

コードをインポートします。PHPではinclude(_once)やrequire(_once)が用意されていますが、本メソッドはクラスの二重読みを避けたり、下位ディレクトリまでサーチしたり、継承クラスの同時読みを試みたりといった多彩な機能を備えています。
機能の性質上、大変処理が重いのですが、一度読み込んだ場合はそのパスをキャッシュして二度目以降の呼び出しは高速に読み込むことができます。
引数はかなり柔軟にできています。たいていは$typeと$nameを指定するだけでほとんどのファイルを読み込むことができます。特別な命名規則がある場合は$fileにパスを指定します。

一長一短がある。公開環境がレンタルサーバである場合は、使いたいPEARのパッケージを個別にアップロードする感じになると思う。PEARライブラリの用途がCake以外にもあるかどうかで変わるのかな。
ちなみにコア側のVendorsに格納した場合は、そのコアを使うアプリケーション全部で使えるが、アプリケーション側のVendorsに格納した場合はそのアプリケーションだけで使えることになる。

参考

http://api13.cakephp.org/class/app#method-Appimport
App::import()のAPI仕様が書かれています。