CodeIgniterの学習 15 - Zend Framework を CodeIgniter上で使う

ええと、昨日のエントリの続き、
Zend Frameworkにある沢山の有用なライブラリを、CodeIgniterで使えるようにしてしまいましょうというお話。

「じゃあ全部 Zend Frameworkで作ればいいじゃん」 と言う話は置いておく。
CodeIgniterで足りないライブラリは一から作らずにZend Frameworkを使っちゃおうと。ハイブリッド最強。


元ネタは、FreakAuth(ログイン認証)のところから。
http://www.4webby.com/freakauth/tutorials/using-zend-framework-components-in-code-igniter.html

基本ほぼここに書いて有るとおりなんだが、一応作業履歴を残す。


手順

1)Zend Frameworkのソースをダウンロードして解凍する。
http://framework.zend.com/download/latest から ZendFramework-1.6.1.tar.gzをダウンロードした。


2)ディレクトリ application/my_classes/ を作成する。
この下にライブラリを入れる。pearとかもここに入れればいいか。


3)application/my_classes/以下にZendFramework-1.6.1/library/Zendディレクトリを丸まるコピーする。
(application/my_classes/Zend/ ね、元ネタの説明とちょっと構成が違うみたい。)


4)application/config/config.php で、$config['enable_hooks'] = TRUE; に設定する。
フックを有効に。


5)application/config/hooks.php に以下の記述を追加する。

これでコントローラが呼ばれる直前にフックがかかり、
application/hooks/MyClasses.phpの MyClasses->index() が呼ばれる。

<?php
//上略

//for my_classes
$hook['pre_controller'][] = array(
'class' => 'MyClasses',
'function' => 'index',
'filename' => 'MyClasses.php',
'filepath' => 'hooks'
);

//下略
 ?>


6)application/hooks/MyClasses.php を以下の内容で作成する。

インクルードパスを追加しているだけ。
元ネタでは APPPATH . 'my_classes/' の所が、 BASEPATH.'application/my_classes' だったけど、
ウチのディレクトリ構成が、 http://d.hatena.ne.jp/dix3/20080919/1221815250 の様にしているから。

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MyClasses {
    /**
     * includes the directory application\my_classes\ in your includes directory
     */
    function index()
    {

        // includes the directory application\my_classes\
        // for windows tests change the ':' before APPPATH to ';'
        //ini_set( 'include_path', ini_get( 'include_path' ) . ':' . APPPATH . 'my_classes/' );
        ini_set( 'include_path', APPPATH . 'my_classes/' );//余計なインクルードパスを読み込まないようにした。
    } 
} 

/* End of file MyClasses.php */
/* Location: ./application/hooks/MyClasses.php */
 ?>

動作確認用サンプルソースを作る

これまた元ネタ http://www.4webby.com/freakauth/tutorials/using-zend-framework-components-in-code-igniter.html とほぼ一緒。

FlickrAPIを叩くライブラリの使用例。独自性なくてすんません。


ここから先はほぼ Zend_Service_Flickr の世界。

Flickrapi_keyは別途必要、my.yahoo.comのアカウント(Flickrのアカウント)が有ればすぐとれる。
http://www.flickr.com/services/api/keys/apply/


1)コントローラ側: application/controllers/flickr.php

なんかキーワードを入れて検索するとそのタグでFlickrから画像を取得するだけ。
http://framework.zend.com/manual/ja/zend.service.flickr.html からたどればいろいろ書いてる。

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

// フリッカーの実験
class Flickr extends Controller {
  // コンストラクタ
  function Flickr()
  {
    parent :: Controller(); 
    // ログイン認証、ログインしてなければログイン画面に飛ばされる
    //$this -> freakauth_light -> check();
  } 
  function index()
  {
    require_once( 'Zend/Service/Flickr.php' );
    $flickr = new Zend_Service_Flickr( '*** api_keyを貼り付ける ***' );
    $body = "";
    $info ="";
    $word = isset($_POST['word']) ? $this->input->xss_clean($this->input->post('word')) : "" ;
    try {
      if($word){
        $results = $flickr -> tagSearch( $word ,array("per_page"=>30,) );
        if ( $results -> totalResults() > 0 ) {
          foreach ( $results as $result ) {
            if("0" == $result -> license ){//todo:こういうときに使って良いライセンスって何番?
              $uri = $result -> Square -> uri ;
              $clickUri = $result -> Square -> clickUri ;
              $body .= '<a href="' . $clickUri . '" target="_blank" style="border:0;text-decoration:none;"><img src="' . $uri . '" style="border:0;" /></a>';
            }
          } 
        } else {
          $info = $word. 'は見つからなかったよ';
        } 
      }else{
        $info = 'なんか入れてくだされ';
      }
    } 
    catch ( Zend_Service_Exception $e ) {
      $info = 'なんかエラーが発生したからもう一度ためしてみてね';
      //$info .= $e -> getMessage();
    } 
    //取得結果を格納
    $data["body"] = $body;
    $data["info"] = $info;
    $data["word"] = $word;
    // 大枠のテンプレート側の変数(ヘッダ部分のタイトルと、xajax用javascriptタグ)
    $tpl["page_title"] = "Zendフレームワークとの融合テスト"; 
    // 中身のテンプレートにデータをセット
    $tpl["main_content"] = $this -> load -> view( 'flickr_view', $data , true ); 
    // 大枠のテンプレートに、タスクリストのビューをはめ込む
    $this -> load -> view( 'base_view', $tpl );
  } 
} //Endofclass
/**
 * End of file flickr.php
 */
/**
 * Location: ./application/controllers/flickr.php
 */
 ?>


2)ビュー側(中身):application/views/flickr_view.php

<h2>↓Zend Frameworkとの融合テスト↓</h2>
<h3>(Zend/Service/Flickr.phpを使ってみるテスト)</h3>
<form method="post">
<label>タグ検索</label>
<input type="text" name="word" style="width:200px;" value="<?=form_prep($word);?>">
<input type="submit" name="submit" value="検索するっす">
<?php if($info){ ?><p class="info yellow"><?=$info?></p> <?php } ?>
<div>
<?=$body?>
</div>
</form>


3)ビュー側(外枠):application/views/base_view.php
以前のエントリと同じなので省略


結果

花は美しい。
apiの反応が遅いから、非同期で取得してかつキャッシュさせないと重すぎるな。

Zend Framework on CodeIgniter つう組み合わせで夢が広がりまくりんぐ。



dix3はhookのつかいかたをてにいれた。
dix3はZend Frameworkをてにいれた。

はやくコーディングしろよ、俺。



(08/11/17一部変更、ini_set時に余計なインクルードパスを読み込まないようにした。)