フルスタックエンジニアを目指す|株式会社ナンバーワンソリューションズ

フルスタックエンジニアを目指す

CakePHP

CakeDC/Users でイベント発生後の動作をカスタマイズする

投稿日:

プラグインなどを導入すると、簡単にいろんな動作を実現できます。一方で「動きを少しだけ変更したい」「特定の動作の前後に、何らかの処理を行いたい」などの細かいニーズに対応できない場合があります

この問題への対応として、色んなアプローチがあります。「プラグインのクラスを継承したクラスを作りオーバーライドする」「Viewファイルであれば、アプリ内にコピーして、直接書き換える」、その他にも方法はあるかもしれません

今回は、CakePHPが備えている「イベント」を利用して、動作の前後に何らかの処理を行うことに挑戦します。幸い「CakeDC/Users」プラグインではイベントのフックが備わっています。イベントが発生したタイミングで何らかの処理を行っていきます

CakeDC/Usersでのイベント

GitHubのドキュメントページで登録されているイベントが記載されています。実際には、これ以外のイベントも設定されているようです。プラグインのソースコードを読んでいくと、様々なタイミングでイベントが実行されるようになっています

CakeDC/Usersのイベント

これらのイベントのタイミングで動作する処理を作ります

CakePHPでのイベント

本家サイトの紹介されています

CakePHPのイベントシステム

ここですべて紹介されているので、改めて紹介する必要はないのですが…。気を取り直して、やります

イベントリスナーの作成

イベントリスナーを作成します。特定のイベントが発生したら、動作するクラスをまずは作ります。ファイルは、「src/Event」に作ります。「Event」のディレクトリがない場合は、作ります

今回はログイン後に、Flashメッセージで「ログインしました」と表示する処理にします

src/Event/UserEventListener.php

「EventListenerInterface」を実装したクラスを作ります。「implementedEvents」メソッドでイベント名と動作するメソッドを配列で定義します。「UsersAuthComponent::EVENT_AFTER_LOGIN」はCakeDC/Usersで定義されているログイン後のイベントです

イベント発生後に「afterLogin」メソッドが実行されます。引数として「Cake\Event\Event」が渡されます。「$event」の「_subject」に実行中のコントローラの情報などが格納されているので、それを使って処理を拡張します

イベントリスナーを登録

イベントを登録させる方法は色々とアイディアがあるみたいですが、一番簡単、かつ、わかりやすい手法ということで「bootstrap」に書きます

EventMangerに「UserEventListener」のインスタンスを登録します。これで完成。わかりやすかなと思いますが、このアプローチだとBootstrapが肥大化していきますので、分割するなどが必要かもしれません

とりあえず、これで、ユーザーがログインした後に、フラッシュメッセージが表示されるという機能を実現できました

-CakePHP

Copyright© フルスタックエンジニアを目指す , 2019 All Rights Reserved Powered by STINGER.