STEAM PLACE

エンジニアリングとマネジメント

CakePHP / 「Call to a member function success() on a non-object」 エラーが発生したら

CakePHP 2.7.x でのフラッシュメッセージの表示でエラー発生

CakePHP 2.7.0 以降、フラッシュメッセージの表示は FlashHelper にて実装される。

FlashHelper — CakePHP Cookbook 2.x documentation

それはいいのだが、初見殺しだと感じた事があったのでメモ。

 環境

  • PHP 5.4.16
  • CakePHP 2.7.5
    インストール後特に何もしていないプレーンな状態。
  • アプリケーションは bake all Foo のように bake コマンドで作成

 事象

bake コマンドで作成したアプリケーションにて、データの削除や追加などを行うと下記エラーが表示された。

 
Call to a member function success() on a non-object

表示されているファイル・該当行を確認すると、下記のような箇所でエラーが発生している。

 
$this->Flash->success(__('Hoge is foo.'));

Flash オブジェクトが無いのだが何故ないのかが最初はわからなかった。
ドキュメント読む限りはセッションにフラッシュメッセージがセットされるようなので、セッションが動作していないかを疑ったが、特に問題なく動作していた。

 原因

原因はコントローラーにて、コンポーネントが設定されていなかったから。
コントローラーのクラス定義の一番上の方にコンポーネントを設定している箇所がある。

 
// ここでコンポーネントを設定している
public $components = array('Paginator');

下記のように FlashComponent を設定する。

 
public $components = array('Paginator', 'Flash');

これでエラーが解消されて、フラッシュメッセージが無事表示される。
bake コマンドの時点で FlashComponent を設定しておいてくれればいいのに。