CodeIgniterの学習 68 - Zend_RegistryをCodeIgniter上で簡単に呼び出すラッパーを作る

こんにちは、もうすぐ春ですね。僕にもそろそろ春は来るのでしょうか?

今日は CodeIgniter上でZend_Registryを使ってみることにする。

(過去のエントリーで既にZend Frameworkは使える状態にしているので、使えるようにするまでの説明は省略。詳しくはそっちをみてね。)


たまには道を外れたいときもあるさ

極たまにだけど、どうしても事情があって$GLOBALSを使いたくなるようなケースってあるんだよね。
でも$GLOBALSは使いたくない。

そんなときのZend_Registry。

マニュアル(http://framework.zend.com/manual/ja/zend.registry.html)を引用すると、

レジストリは、アプリケーション空間でオブジェクトや変数を保存するためのコンテナです。 変数をレジストリに保存すると、 そのオブジェクトはアプリケーション内でいつでも利用できるようになります。 この仕組みは、グローバルなストレージを使用する代わりに使用できます。

ということで、早速使ってみることにした。


そのまま使っては面白くないしブログのネタにもならないので、
CodeIgniterのヘルパーとしてラップしてみた。


ラッパーソース:application/helpers/registry_helper.php

ほぼサンプルのまま。これだけで$GLOBALSの代わりになるなんてとても嬉しいワン。

<?php if ( !defined( 'BASEPATH' ) ) exit( 'No direct script access allowed' );
require_once( 'Zend/Registry.php' ); //ヘルパーにソースを寄せておくため敢えてここでrequireしておく
// Zendレジストリに一時データを保存
if ( ! function_exists( 'reg_set' ) ) {
    function reg_set( $key = '', $value = '' )
    {
        if ( $key ) {
            Zend_Registry :: set( $key, $value );
        } 
    } 
} 
// Zendレジストリから一時データを取得
if ( ! function_exists( 'reg_get' ) ) {
    function reg_get( $key = '' )
    {
        return reg_isset($key) ? Zend_Registry :: get( $key ) : null ;
    } 
} 
// Zendレジストリから一時データを全件取得
if ( ! function_exists( 'reg_get_all' ) ) {
    function reg_get_all()
    {
        $ret_arr = array();
        $registry = Zend_Registry :: getInstance();
        foreach ( $registry as $key => $value ) {
            $ret_arr[$key] = $value;
        } 
        return $ret_arr;
    } 
} 
// Zendレジストリに該当キーで一時データが保存されているかの確認
if ( ! function_exists( 'reg_isset' ) ) {
    function reg_isset($key='')
    {
        return $key ? Zend_Registry :: isRegistered( $key ) : false ;
    } 
} 
/**
 * End of file registry_helper.php
 */
/**
 * Location: ./application/helpers/registry_helper.php
 */

 ?>

Zend_Registry内にはいろんなメソッドがあるみたいだけど、

  • reg_get
  • reg_set
  • reg_get_all
  • reg_isset

でラップした4つでとりあえず事足りそう。これなら鳥頭の俺でもすぐに使える。


動作確認

いつでもどこでも気軽に呼べるように(いや呼ばないけど)
application/config/autoload.phpに、

$autoload['helper'] = array('registry',…

と、レジストリーヘルパーを読み込むようにしておく。




適当なコントローラー

適当なコントローラーとビューで動作確認してみる。
(ちなみにこのサンプルだったら、Zend_Registryを使うメリットは全く無い。)

<?php if ( !defined( 'BASEPATH' ) ) exit( 'No direct script access allowed' );
//上略
function index()
{

  reg_set('indexhaorenoyome','いんでっくすたんは俺の嫁');
  reg_set('sogebu','そげぶ');

//中略
}
//下略
  ?>



適当なビュー

こんな感じで呼び出してみる。
ここではビューで呼び出したが、別にモデルでもライブラリでもなんでもいい。(コア部分でヘルパーが呼みこまれる前の箇所は除く。)

<h2>Zend_RegistryをCodeIgniterのヘルパー化してみたテスト</h2>
(このサンプルではあまり意味が無いけど、$GLOBALSの代わりに使いたいときはある。)

<dl>
  <dt> reg_get('indexhaorenoyome') の結果 </dt>
  <dd class="info red"> <?= reg_get('indexhaorenoyome') ?></dd>
  <dt> reg_isset('sogebu') の結果 </dt>
  <dd class="info green"> <?= reg_isset('sogebu') ?> </dd>
  <dt> var_dump(reg_get_all()) の結果 </dt>
  <dd class="info yellow"> <?php var_dump(reg_get_all()) ?> </dd>
</dl>


動作画面


うむ、成功。




今月の更新は週1回位かな。