1

カスタム モデルのコールバックを作成するには、適切な出発点が必要です。アプリケーションの特定の部分では、テーブルが大きいため、デフォルトの CakePHPライフサイクル コールバック(beforeSave、afterSave、..) を使用できません。コントローラーでは、ユーザーの 4 ステップ登録など、部分的な更新レコードを含むメソッドをさらに作成します。

新しいユーザー アカウントが作成される前にのみ使用されるbeforeRegisterなどのカスタム モデル コールバックを作成する方法は?

4

1 に答える 1

2

CakePHP 2.x の概念に近いコールバック メソッドを使用するよりも、リッスンできるイベントをディスパッチすることをお勧めします。

この本には、イベントに関する章があります。

具体的には、作業中のレイヤーを含む名前を使用して、新しいイベントをディスパッチする必要があります。

// Inside a controller
$event = new \Cake\Event\Event(
    // The name of the event, including the layer and event
    'Controller.Registration.stepFour', 
    // The subject of the event, usually where it's coming from, so in this case the controller
    $this, 
    // Any extra stuff we want passed to the event
    ['user' => $userEntity] 
);
$this->eventManager()->dispatch($event);

次に、アプリケーションの別の部分でイベントをリッスンできます。個人的には、ほとんどの場合、自分のsrc/Lib/Listenersフォルダーに特定のリスナー クラスを作成するのが好きです。

namespace App\Lib\Listeners;

class RegistrationListener implements EventListenerInterface
{
    public function implementedEvents()
    {
        return [
            'Controller.Registration.stepOne' => 'stepOne'
            'Controller.Registration.stepFour' => 'stepFour'
    }

    public function stepOne(\Cake\Event\Event $event, \Cake\Datasource\EntityInterface $user)
    {
        // Process your step here
    }
}

次に、リスナーをバインドする必要があります。これを行うには、グローバル Event Manager インスタンスを使用して で行う傾向があるため、AppControllerどこでもリッスンできますが、1 つのコントローラーだけで作業している場合は、RegistrationsControllerその 1 つのコントローラーだけにアタッチすることをお勧めします。

おそらくあなたのAppController::initialize()

EventManager::instance()->on(new \App\Lib\RegistrationListener());

おそらくあなたのController::initialize()

$this->eventManager()->on(new \App\Lib\RegistrationListener())
于 2015-12-02T11:53:03.773 に答える