CakePHP2からCakePHP3になって変わったCallBack関数
CakePHP2から習慣になっているようにCallBack関数の中で parent::関数名 を書いてみてエラーを起こして
皆様にはそういった不具合が起こらないようにこの記事を書きます。
エラーが起こったコード
public function beforeFind()
{
parent::beforeFind();
}
ええーなんぞやこれ!と思って原因を探してみたところ。
CakePHP2の時には
//Cake/Model/Model.php
public function beforeFind($query)
{
return true;
}
上記のように
Model.phpにCallBack関数が書いていたためparentが呼べる
CakePHP3には
//src/ORM/Table.php
public function implementedEvents()
{
$eventMap = [
'Model.beforeMarshal' => 'beforeMarshal',
'Model.beforeFind' => 'beforeFind',
'Model.beforeSave' => 'beforeSave',
'Model.afterSave' => 'afterSave',
'Model.afterSaveCommit' => 'afterSaveCommit',
'Model.beforeDelete' => 'beforeDelete',
'Model.afterDelete' => 'afterDelete',
'Model.afterDeleteCommit' => 'afterDeleteCommit',
'Model.beforeRules' => 'beforeRules',
'Model.afterRules' => 'afterRules',
];
$events = [];
foreach ($eventMap as $event => $method) {
if (!method_exists($this, $method)) {
continue;
}
$events[$event] = $method;
}
return $events;
}
上記のように
今のObjectにあるCallBack関数を探して$eventsに入れてreturnしています。
CakePHP2のように定義されていないので,
public function beforeFind()
{
}
普通に書いたら動く。
##ちなみに
CallBack関数全部がそういうわけではない。
//Cake/Controller/Controller.php
public function implementedEvents()
{
return [
'Controller.initialize' => 'beforeFilter',
'Controller.beforeRender' => 'beforeRender',
'Controller.beforeRedirect' => 'beforeRedirect',
'Controller.shutdown' => 'afterFilter',
];
}
public function beforeFilter(Event $event)
{
return null;
}
Controller.phpにはこのようにCallBack関数が定義されているので,
**parent::**で呼べる。
use Cake\Event\Event;
public function beforeFilter(Event $event )
{
parent::beforeFilter($event);
}
結論
CakePHP3では
TableのCallBackは**parent::が使えない。
しかし、ControllerのCallBackにはparent::callback名($event)**が使える。
以上です。