LoginSignup
6

More than 5 years have passed since last update.

CakePHP2からCakePHP3になって変わったCallBack関数

Last updated at Posted at 2015-12-23

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)が使える。
以上です。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6