Zend Frameworkでping送信

2008/05/23 | Zend Framework

今やブログでおなじみになったping送信。しかしXML-RPCという特性上(かどうかは知らないけれど)、ping送信を実現するためのPHPスクリプトのサンプルを提供しているサイトはほとんどない。やっぱり少しだけ敷居が高いためだろうか。
かくいう自分もping送信はよく理解できなかったのだが「案ずるより産むが易し」で、どこからかサンプルを探してきて、試しているうちに理解できるようになった。
ping送信は生のPOSTデータを取り扱うので、一から自分で書くとPHPやWeb、XML-RPCに関する理解が深まるが、やはりお気楽にプログラムを書きたいところ。今まではPEARなどのライブラリを使って書いていたのだが、それでも結局10行以上書かなくてはならなかった記憶がある。

で、革命。Zend_XmlRpcを使うとたった3行でping送信ができる。サンプルスクリプトはこんな感じ。

require_once ‘Zend/XmlRpc/Client.php';
$client = new Zend_XmlRpc_Client($server);
$client->call(‘weblogUpdates.ping’, array($title, $url));

$serverはping送信先URL、$titleにはブログタイトル、$urlにはブログURLを代入すればいい。1行目はライブラリの読み込みなのだから実質2行でping送信ができるわけだ。

これには参った。ほんと、よくできてるよ、Zend Framework。

RSSの出力

2008/05/21 | Zend Framework

Zend FrameworkにはRSSを処理するためのZend_Feedというライブラリがあるのだが、これは外部のRSSを読み込んで処理するだけでなく、自サイト内のRSSを生成する、といった場合にも使用できる。具体的には以下の通り。

// 基本的な設定は別途保存しておいて呼び出す
$config=Zend_Registry::get(‘config’);
// RSSのためのデータ作成
$data=array();
$data[‘title’]=$config[‘base’][‘title’];
$data[‘link’]=$config[‘base’][‘url’];
$data[‘charset’]=$config[‘base’][‘charset’];
$data[‘description’]=$config[‘base’][‘description’];
$data[‘author’]=$config[‘base’][‘author’];
$data[’email’]=$config[‘base’][’email’];
$data[‘entries’]=array();
//$rowsはデータベースなどから取得した情報(適宜変更)
foreach($rows as $row){
  $data[‘entries’][]=array(
    ‘title’=>$row[‘name’],
    ‘link’=>$config[‘base’][‘url’].’/show?id=’.$row[‘id’],
    ‘description’=>$row[‘message’],
    ‘guid’=>$row[‘id’],
    ‘content’=>$row[‘message’],
    ‘commentRss’=>$config[‘base’][‘url’].’/show?id=’.$row[‘id’],
    ‘lastUpdate’=>strtotime(date(‘Y-m-d H:i:s’,$row[‘created’])),
  );
}

いろいろな方法が取れるとは思うが、とりあえず形になったのでメモだけしておく。

Zend_Configを使ってみた

2008/05/14 | Zend Framework

Zend_Configは、設定ファイルを読み込むためのライブラリだ。通常PHPで設定ファイルを用意する際、自分はこんな具合に書いている。

define(‘ADMIN_MAIL’,’admin@example.com’);
define(‘ADMIN_PASSWORD’,’hogehoge’);

define文の列挙だ。これはこれでいいのだが、設定ファイルを素人な方に編集させるのには気が引ける。そんな場合に便利なのがZend_Configだ。Zend_Configにはiniファイル形式の設定ファイルを取り扱うZend_Config_IniとXML形式の設定ファイルを取り扱うZend_Config_Xmlとがある。当然、直感的にわかりやすいZend_Config_Iniを使う。

設定ファイルにはWindowsのiniファイル等でおなじみの書式を使って設定を記述する。

[admin]
mail=admin@example.com
password=hogehoge

[datasource]
db.host=localhost
db.name=hoge
db.user=fuga

上記の設定が書かれたファイルをconfig.iniというファイル名で保存するとZend_Config_Iniを使って以下のように呼び出す。

$configObj = new Zend_Config_Ini(‘config.ini’,NULL);

これだけで、$configObj->admin->mailなんて具合にオブジェクトのプロパティとしてアクセスできるようになる。db.hostみたいにドットで区切られている場合は、$configObj->datasource->db->hostみたいな感じになる。

自分の場合は、オブジェクトではなく、関数を一つかませて、オブジェクト形式から配列形式に変換して使用している。

function _readConfig($configObj)
{
  $configs=array();
  foreach($configObj as $configKey => $configValue){
    if(is_object($configValue) || is_array($configValue)){
      $configs[$configKey]=_readConfig($configValue);
    }else{
      $configs[$configKey]=$configValue;
    }
  }
  return $configs;
}

さらにZend_Registryとセットで使うと「初期設定を読み込んで、共通変数にセット」なんてことがすぐにできる。これも便利だ。

Zend_Registryを使ってみた

2008/05/13 | Zend Framework

異なるクラス間で共通の値を持ちまわりたいときは苦労する。引数で渡すか、グローバル変数として定義するか、方法はいろいろあるが問題もある。

・引数で渡す
いろいろなメソッドで使う場合、その都度毎回引数で渡すのは面倒。
・グローバル変数として定義する
どこかで変数名がバッティングしないかちょっと不安。

そんなのを解決してくれるのがZend_Registryだ。使い方は超簡単。

・変数の登録
Zend_Registry::set(‘変数名’,’変数の値’);

・変数の呼び出し
Zend_Registry::get(‘変数名’);

上記のように直接メソッドを呼んでもいいし、オブジェクトを生成してからメソッドを呼んでもいい。何より、非常に簡単というのが最高にいい。ますますZendに惹かれる今日この頃だ。

Zend FrameworkでどのようにSmartyを組み込むか

2008/05/12 | Zend Framework

先日作ったZend Frameworkウェブアプリだが、実は気になっている部分が一つ。Smartyの使い方というか配置だ。Zend Frameworkのマニュアルには、Smartyを組み込むためのViewスクリプトだけが紹介してある(参照)。しかし、これは単なるスクリプトであって、実際の組み込み方はどこにも書いてない。厳密に言うと、組み込むのはrequireしてオブジェクト生成だが、フレームワーク内での教科書的な組み込み方に関する記述がないのだ。

とりあえず、自分ではZend_Controller_Actionを継承したbaseControllerを作成し、その中でpreDispatchメソッドを定義して、以下のように書いておいた。テンプレートの配置場所とかキャッシュ生成場所とかもルールにのっとって配置するようにした(その他設定はお好み次第で)。

public function preDispatch()
{
  $controllerName  = ucfirst($this->getRequest()->getControllerName());
  $viewDir    = dirname(__FILE__).’/../views';
  $templates_dir  = $viewDir.’/scripts/’.$controllerName;
  $extraParams  = array();
  $extraParams[‘compile_dir’]    = $templates_dir.’/templates_c';
  $extraParams[‘plugins_dir’]    = array(‘plugins’,$viewDir.’/plugins’);
  $extraParams[‘left_delimiter’]  = ‘<{';
  $extraParams[‘right_delimiter’]  = ‘}>';
  
  $this->view    = new Private_View_Smarty($templates_dir<$extraParams);
  $this->view->getEngine()->load_filter(‘pre'<‘convert_encoding’);
}

ただコレだけだと実はNG。例えばVIEWの必要がないアクションを用意した場合、これを組み込んだ基底クラスを継承すると問題が起きる。このメソッドの定義上、該当するテンプレートディレクトリやキャッシュディレクトリが存在しないとおかしなことになるわけだ。

そう考えると、いろいろなエラー制御も含めて、コード自体も設置方法自体も検討しなくてはいけない。悩ましい。

どうせなら、本当に教科書的なものを用意してくれればよかったのにね。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net