2010年2月15日月曜日

Zend_Registryの使い方

Zend_Registryの使い方をとりあえずメモ

グローバルな値を格納するときに利用できるZend_Registryの利用方法をなんとなくメモ

利用は簡単で、Zend_Registry::set("変数名","値");でセットした値をZend_Registry::get("変数名");で取得する。

Zend_Registry::get('変数名');を実行する前に、Zend_Registry::set("変数名","値");を実行しておかないと、Zend_Exceptionがスローされる。

変数に設定しているクラス名からクラスを生成

Zend_Applicationでは、Bootstrapクラスを外部ソースで指定できるので、クラス名の文字列からクラスが生成できるだろうと思って調べてみたのでなんとなくメモ。


Zend_ApplicationのsetBootstrap()を見ていると、以下の記述があった。
コード例)
 $this->_bootstrap = new $class($this);
 どうやら、クラス名を文字列として指定して、生成できるよう。
ただ、
コード例)
 new 'クラス名'():

ではエラーになる。
一度変数に格納しないとだめなようです。


メソッドも同じように変数に一度格納することによって以下のような書き方できる。

コード例)
$class="aaa";
$method="bbb";
//aaaクラスを生成
$aaa=new $class();

//aaaのbbbメソッドを実行
$aaa->$method();

面白い。

BootstrapでのZend_Db_Tableにプロファイラの登録方法

Zend_Application_Resource_Dbを利用して、プロファイラを設定することはできなさそうなので、Bootstrapで設定する方法を、なんとなくメモ

Bootstrapから、'db'リソースを取得して、プロファイラを設定するだけ。

コード例)

function _initDbProfile(){
  $this->bootstrap('db');
  $db=$this->getResource('db');
  $profiler=new Zend_Db_Profiler_Firebug("All Querys");
  $profiler->setEnabled(true);
  $db->setProfiler($profiler);
}

ついでにメタデータをキャッシュする方法も追加すると以下のようになる。


コード例)メタデータをキャッシュする場合
function _initDbProfile(){
  $this->bootstrap('db');
  $db=$this->getResource('db');
  $profiler=new Zend_Db_Profiler_Firebug("All Querys");
  $profiler->setEnabled(true);
  $db->setProfiler($profiler);
  // フロントのオプション設定
  $frontendOptions = array(
    'automatic_serialization' => true
  );
  //バックエンドのオプション(ファイルへ吐き出すので、
  //キャッシュファイルを配置するディレクトリを指定
  $backendOptions  = array(
    'cache_dir'                => APPLICATION_PATH . '/data/cache'
  );
  //キャッシュオブジェクトを作成。キャッシュはファイルへ
  $cache = Zend_Cache::factory(
    'Core',
    'File',
    $frontendOptions,
    $backendOptions
  );
  // テーブルオブジェクトで使用するように設定します
  Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);
}

Zend Framework1.10からはZend_Application_Resource_Cachemanagerが利用できるので、もう少し記述が簡単になるのと、定義を外部に出せるのでメンテナンスはしやすくなるはず。
Zend_Application_Resource_Cachemanagerはおいおい調査

PHPでの処理実行時間取得

PHPで処理時間を知りたくなったので、なんとなくメモ

処理前後の時間をmicrotime()で取得して、差分を取得する。
microtime()は戻りが小数部、半角スペース、整数部の文字列になっているので、explodeで分割して、配列に格納してから、floatに変換しておく。

コード例)
$start=explode(' ',microtime());
sleep(5);
$end=explode(' ',microtime());
$diff=((float)$end[0]+(float)$end[1])-((float)$start[0]+(float)$start[1]);

2010年2月13日土曜日

Zend Framework 1.10.1リリース

Zend Framework 1.10.1リリースがリリースされてました。

変更点はよくわかりませんが、バグフィックスが中心かな?

2010年2月9日火曜日

Zend_View_Helperを自作する

Zend_View_Helperを自作する必要があったので、とりあえずメモ。

ヘルパーはZend_View_Helper_InterfaceかZend_View_Helper_Abstractを継承して作成する。

クラス名には、View_Helperを入れておいたほうがよいと、リファレンスに書いてあった。
クラスのメソッドとして、必ずクラス名からプレフィックスを除いた名称と同じ名前のメソッドを用意する必要がある。
※クラス名ははじめが大文字、メソッド名ははじめは小文字で。

コード例) 引数を大文字にするだけの簡単なHelperクラス
class My_View_Helper_StrUpper extends Zend_View_Helper_Abstract {
    public function strUpper($val){
        return strtoupper($val);
    }
}

配置先は、とりあえず、views/helpers配下あたりに置いておく。
 上のクラスの場合は、以下のようになる。
配置例)
views/helpers/StrUpper.php



このままではZend_Viewはヘルパークラスを認識できず、使えないので、独自のヘルパークラスを探してもらうようにZend_Viewに探し先を登録する必要がある。
パスを追加するには、Zend_ViewのaddHelperPath()を使う。
第一引数に、パス名(絶対パス)、第二引数にクラス名のプレフィックスを指定する。
コード例) コントローラ内でパスを通すときの書き方
$this->view->addHelperPath(APPLICATION_PATH.'/views/helpers','My_View_Helper');

※ヘルパーのクラス名をZend_View_Helper_XXXXとしておくと、ヘルパーのパス追加は必要がない。ただ、Zend_xxxとつけられるのはZendだけなので、めんどくさがらずに設定をしておくこと。

上記を行うことで、テンプレートにおいて、独自ヘルパーを利用できるようになる。

 コード例)テンプレート内での記述
<div>
<?php echo $this->strUpper("aa"); ?>
</div>

ViewHelperは以外に便利。

Zend_Layoutの制御

Zend_Layoutの制御の仕方をなんとくなくメモ

  ・Zend_Layoutオブジェクトを取得
        i)どこでも
            $layout = Zend_Layout::getMvcInstance();
        ii)ActionControllerから(その1)
            $layout=$this->_helper->layout;  
        iii)ActionControllerから(その2)
            $layout=$this->_helper->getHelper('layout');

    ・Zend_Layoutを無効にする
        $layout->disableLayout();
    ・Zend_Layoutを変更
        $layout->setLayout('nomal');

    ViewHelperの中には、LayoutやViewを自動的に無効にしてくれるものもある。
    Zend_View_Helper_Jsonなど



Viewにヘルパーを追加するようなときに必要になると思うので、ついでにZend_Viewの取得方法もついでにメモ。

Zend_Viewを使用しないと明示しない限り、自動的にZend_Viewは生成されているので、生成されているインスタンスを取得する方法をなんとなく列挙。

i)コントローラから
 $this->view
ii)どこでも
Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setNoRender(true);

iii)Bootstrap内で
$this->bootstrap('view');//一度初期化しておいたほうが間違いがない。
$this->getResource('view');    


他にもあるかも知れないけど、まぁこんなもんで。