Webアプリケーション情報のスクラップ集

お知らせ

Blogサイトを公開しました

2008-10-20

新着記事

PHP関連

symfony1.2でaskeet(サンプルのQ&Aサイト)を再構築する

DB関連

MySQLでのランキング計算

アプリケーションサンプル

CodeIgniterで作成した簡易プロジェクト管理システム


Links


 PHP5限定 CakePHPのView内の関数処理を綺麗に記述する(邪道でしょうか?)

 

CakePHPなどビューをPHPで記述する場合に、PHPの標準関数を利用することが多々あります。標準関数自体は豊富なものが揃ってますが、連続して処理を行いたい場合にどうしても読みづらい記述になってしまいます。PHP5にはクラス内にAutoloadの機能があり、これを利用して連続して関数処理を行う方法を検討します。

 

今回の事例

ある変数に長文のテキスト文字列が入っていて、それを表示する際に以下の処理を行うケースを例とします。

  1. 文字列を先頭から100文字にカットする
  2. 英数字を半角にする
  3. HTMLエスケープ処理をする
  4. 改行コードをbrタグに変換する
  5. 表示

PHPの標準関数だけで(一行で無理矢理)記述した場合

 

<?php echo nl2br(htmlspecialchars(mb_convert_kana(mb_substr($text, 0, 100), 'a'))); ?>

 

のようになり、とても読み易いとは言えません。これをCakePHPの短縮関数に置き換えると、

 

<?php echo n(h(mb_convert_kana(mb_substr($text, 0, 100), 'a'))); ?>

 

となり、少しは読み易くはなりますが、最後の多重括弧や処理の順番が逆順なのは防げません。

そこでPHP5のautoloadを利用した関数ヘルパーを作成します。

 

関数ヘルパー(FxHelperクラス)の作成

 結論から言えば、このクラスを利用することで、上記の処理は以下のように記述できます。

 

<?php fx($text)->mb_substr(0, 100)->mb_convert_kana('a')->h()->n()->e(); ?>

 

コードは若干長くなりますが、->で実行する処理を処理順に記述できるので、ビューなどで利用した際に

可読性が向上し、後で中間に処理を追加する際もメンテナンスし易くなります。

最後のe()はechoの代替メソッドとなっています。

 

ビューだけではなく、普通にPHP内であればどこでも利用できますが、autoloadの負荷が懸念されますので、

あまり頻繁に使わないほうがよいのかもしれません。

(やはりこういった手法は邪道でしょうか??)

 

views/helpers/fx.php

 

class FxHelper extends Helper {
 protected $value;
 protected $arg_push = 0;
 
 function s($value) {
  $this->value = $value;
  return $this;
 }
 function e() {
  echo $this->value;
  return $this;
 }
 function v() {
  return $this->value;
 }
 function p() {
  $this->arg_push = 1;
  return $this;
 }
 
 public function __call($method, $arguments)
 {
  if($this->arg_push){
   $arguments[] = $this->value;
   $this->arg_push = 0;
  }
  else{
   array_unshift($arguments, $this->value);
  }
  $this->value = call_user_func_array($method, $arguments);
  return $this;
 }
}

 

// Global Function

function fx($value){
 $fx = new FxHelper();
 $fx->s($value);
 return $fx;
}

 

 

 

 

投稿日:2008/10/20

前後の記事


コメント

▲ページの先頭へ