1. dskst

    Posted

    dskst
Changes in title
+CakePHP / 「Call to a member function success() on a non-object」 エラーが発生したら
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,50 @@
+## CakePHP 2.7.x でのフラッシュメッセージについて
+
+CakePHP 2.7.0 以降、フラッシュメッセージの表示は FlashHelper にて実装される。
+
+[FlashHelper — CakePHP Cookbook 2.x documentation](http://book.cakephp.org/2.0/en/core-libraries/helpers/flash.html)
+
+それはいいのだが、初見殺しだと感じた事があったのでメモ。
+
+## 環境
+
+* PHP 5.4.16
+* CakePHP 2.7.5
+インストール後特に何もしていないプレーンな状態。
+* アプリケーションは `bake all Foo` のように bake コマンドで作成
+
+## 事象
+
+bake コマンドで作成したアプリケーションにて、データの削除や追加などを行うと下記エラーが表示された。
+
+```
+Call to a member function success() on a non-object
+```
+
+表示されているファイル・該当行を確認すると、下記のような箇所でエラーが発生している。
+
+```php
+$this->Flash->success(__('Hoge is foo.'));
+```
+
+Flash オブジェクトが無いのだが何故ないのかが最初はわからなかった。
+ドキュメント読む限りはセッションにフラッシュメッセージがセットされるようなので、セッションが動作していないかを疑ったが、特に問題なく動作していた。
+
+## 原因
+
+原因はコントローラーにて、コンポーネントが設定されていなかったから。
+コントローラーのクラス定義の一番上の方にコンポーネントを設定している箇所がある。
+
+```php
+// ここでコンポーネントを設定している
+public $components = array('Paginator');
+```
+
+下記のように FlashComponent を設定する。
+
+```php
+public $components = array('Paginator', 'Flash');
+```
+
+これでエラーが解消されて、フラッシュメッセージが無事表示される。
+bake コマンドの時点で FlashComponent を設定しておいてくれればいいのに。