CakePHP2.xとPHP5.4でStrict Errorが出た場合の対処法

PHPでは、error_reportingの設定により出力するメッセージを変更可能ですが、PHP5.4からE_ALLにE_STRICTが含まれるようになりました。
通常、E_ALLからE_STRICTを除いてエラーを出力したい場合、php.iniで

error_reporting = E_ALL & ~E_STRICT

とすることで制御可能になります。
エラーレベルについては、マニュアル参照
http://www.php.net/manual/ja/errorfunc.constants.php

但し、CakePHPでは、フレームワーク中でerror_reportingを定義している為、php.iniの設定が反映されません。

その設定が、
cakephp/lib/Cake/bootstrap.php

error_reporting(E_ALL & ~E_DEPRECATED);

で設定されています。

但し、これはフレームワーク本体のプログラムですので、ここを修正すべきではありません。

Cake 2.x では Error コンフィギュレーションが設定ファイルで定義出来るようになりましたので、これを利用します。
cakephp/app/Config/core.php

Configure::write('Error', array(
   'handler' => 'ErrorHandler::handleError',
   'level' => E_ALL & ~E_DEPRECATED,
   'trace' => true
 ));

のlevel部分に~E_STRICTを追加します。

Configure::write('Error', array(
   'handler' => 'ErrorHandler::handleError',
   'level' => E_ALL & ~E_DEPRECATED & ~E_STRICT,
   'trace' => true
 ));

これで、E_Strictのエラーが表示されなくなります。

尚、error_reportingは、PHP5以降で下記の様に変わっています。

バージョン 説明
5.4.0 E_STRICT が E_ALL に含まれるようになりました。
5.3.0 E_DEPRECATED と E_USER_DEPRECATED が追加されました。
5.2.0 E_RECOVERABLE_ERROR が追加されました。
5.0.0 E_STRICT が追加されました (これは E_ALL には含まれません)。

エラー処理なんて、そんなに変わる所でもないと思うのですが。。。メジャーバージョンアップ毎に変わっていくのがPHPらしいですね。

連想配列をCakePHPからjQueryに渡して展開

配列 $arr をCakePHPからjQuery に渡すには
Controllerにて

$this->set('arr', $arr);

Viewにて(※ ViewはHTMLでlayoutしているとして)

$arr = json_encode($arr);
$this->addScript($html->scriptBlock('
var arr = '.$arr.';
$.each(arr,function(k,v){
  //お好きに
});

で良いらしい。json_encode()を思い出せなかったのでメモ。

あ、それか

Controllerにて

$this->set('arr', json_encode($arr));

でも。
“連想配列をCakePHPからjQueryに渡して展開”の続きを読む

CakePHP ログアウト後の表示を分ける

CakePHP 1.2 で、ログアウト後の表示を分けたい場合の処理方法が分からなくて戸惑ったのでメモ。

通常はログアウト後にトップに戻るようにするので、

$this->Auth->userModelに指定したモデルのコントローラー(通常はusers_controller.php)で

function logout() {
	$this->Auth->logout();
	$this->redirect("/");
}

それ以外のページに飛ばしたい場合は、
app_controller.phpのbeforeFilterに設定。

飛ばしたいページが/pages/example/の場合、

//該当する条件分岐内で
$this->Auth->logout();
$this->redirect('/pages/example/');

で良いみたいです。

… 公式サイトとか検索でもlogoutRedirectがどうのこうのとしか見当たらなくてかなり右往左往したので、こんなにシンプルで良いのか不安になる。