SlideShare a Scribd company logo
1 of 35
Download to read offline
EventListener
使いこなし術
Symfony 勉強会 #10

岡田祐一 @okapon_pon
自己紹介
• 名前:岡田祐一 (@okapon_pon)
• 所属:株式会社クロコス エンジニ
ア
• 2013年∼ 日本Symfonyユーザー会
• Symfony歴 2年半ほど
本日の話
EventListener使いこなし術
あらため
EventListenerできること
まえおき
!
Symfonyについて
Symfony
!
素直で柔軟なフレームワーク
Symfony
!
HWに縛られず自由に開発できる
Symfony
柔軟性を支える屋台骨
• DI (+ configuration)
• Event Dispatcher
EventListenerはここの話
Symfony
イベント駆動のフレームワーク
!
フックポイントが用意されている!
Symfonyのイベント
標準で用意されてるイベント
!
• kernel.request
• kernel.controller
• kernel.view
• kernel.response
• kernel.exception
Symfonyのイベント
任意のイベントにフック可能
任意のタイミングでResponse
を返すことが可能
EventListener 実例
それでは例を見ていきましょう
kernel.controllerイベント
kernel.controllerイベント
!
コントローラーの実行前に
発行されるイベント
kernel.controllerイベント
BeforFilterControllerListener
というクラスを作ってみます
kernel.controllerイベント
EventLisnerを登録

# service.yml
services:
my.blog.before_filter_controller_listener:
class: MyBlogBundleEventListenerBeforFilterControllerListener
tags:
- { name: kernel.event_listener, event: kernel.controller, method:
onKernelController }
EventListenerクラス作成
class BeforeFilterControllerListener
{
public function onKernelController(FilterControllerEvent
$event)
{
$c = $event->getController();
if (!is_array($c)) {
return;
}
$controller = $c[0];
!
if (method_exists($controller, 'before')) {
$controller->before($event->getRequest();
}
}
}
EventListenerクラス作成
何やってるか分かりました?
コントローラー側
/**
* @Route("/blog")
* @Template()
*/
class BlogController extends Controller
{
public function before(Request $request)
{
// Actionが呼ばれる前に実行したい処理が書ける
}
!
/**
* @Route("/", name="blog_index")
*/
public function indexAction()
{
}
}
Controller実行前のフック
どこかのフレームワークで
見たことある機能・・・
なぜSymfonyにないのか?
コントローラーに書くと
• 再利用しにくい
• テストしづらい
なぜSymfonyにないのか?
もう一度コードに戻ります
class BeforeFilterControllerListener
{
public function onKernelController(FilterControllerEvent
$event)
{
$c = $event->getController();
if (!is_array($c)) {
return;
}
$controller = $c[0];
!
if (method_exists($controller, 'before')) {
$controller->before($event->getRequest();
}
}
}
EventListenerクラス作成
コントローラー側に書く必要がないと感じませんか?
EventListener まとめ1
EventListenrに記述した方が変
な依存を持たずシンプルに実装
できる
【サンプルコード】
https://gist.github.com/okapon/fd2dfdacf87e417f7957
EventListener 実装例
Securityコンポーネント
よく分からなくて

昔作ったオレオレ認証

https://gist.github.com/okapon/
88f5bd56a886c287a7d1
EventListener 実装例
先ほどの実装例では
isSecure()メソッドはマーカー
→ annotationにするとよい
!
【参考】Doctrine-Common-Annotations
http://docs.doctrine-project.org/projects/doctrine-common/en/
latest/reference/annotations.html
EventListener まとめ2
ユーザー認証の仕組みも
EventListenrを使えば
簡単に実装できる
ちなみに
ここまでkernel.controllerを取
り上げといてなんですが・・・
よく使うのは
• kernel.request
• kernel.response
では気を取り直して
EventListener使いどころ
複数コントローラーで実行したい共通処理
• 認証まわり
• 初回登録時のアクセス判定
• チュートリアルの完了状態で表示出し分け
• アクセスの分析(referrerとか)
チュートリアルの表示判定する例
ユーザーはどこのURLにでもアクセ
スする可能性がある
!
• kernel.requestをフック
• EventListenerでチュートリアル完了か判定
• 完了してなければチュートリアルを表示
TutorialListener実装例1
class TutorialListener
{
public function onKernelRequest(GetResponseEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event-
>getRequestType()) {
return;
}
if (!$this->securityContext->getToken()) {
return;
}
!
$user = $this->securityContext->getToken()->getUser();
if ($this->doseNeedTutorial($user)) {
// チュートリアルのURLにリダイレクトするとか
$event->setResponse(new RedirectResponse('/tutorial',
302));
}
}
}
TutorialListener実装例2
class TutorialListener
{
public function onKernelRequest(GetResponseEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event-
>getRequestType()) {
return;
}
if (!$this->securityContext->getToken()) {
return;
}
!
$user = $this->securityContext->getToken()->getUser();
if ($this->doseNeedTutorial($user)) {
// sessionに状態を入れるとか
$this->session->set(’needTutorial’, true));
}
}
}
アクセスデータの収集に使う例
!
• どこからアクセスされたかreferrerを取る
• sessionに保存
• 必要なタイミングでsessionから取出し保存
アクセスデータの収集に使う例
use SymfonyComponentHttpKernelHttpKernelInterface;
use SymfonyComponentHttpKernelEventGetResponseEvent;
!
class AccessLogListener
{
public function onKernelRequest(GetResponseEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event-
>getRequestType()) {
return;
}
$request = $event->getRequest();
!
// あくまでrefを取るだけのサンプル
// 実際には各種属性情報を保存しとくと良い
$ref = $request->query->get('ref');
if ($ref) {
$request->getSession()->set(‘ref’, $ref);
}
}
}
まとめ(無理矢理)
!
• コントローラ実行前の共通処理を書くの
に便利
• EventListener使えばアイデア次第で色々
ハックできる
• オレオレ作ってしまってもいいじゃない
EventListener おまけ
活用事例としてはbrtriverさんのお話
が非常に参考になります
!
「運用しやすい管理画面とは」
http://tech.voyagegroup.com/archives/7644534.html
!
"PHP Fatal error: Allowed memory size of xxx" で落ちる前にできること
http://d.hatena.ne.jp/brtRiver/20131206/1386345547

More Related Content

What's hot

Vimから見たemacs
Vimから見たemacsVimから見たemacs
Vimから見たemacs
Shougo
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Yoshifumi Kawai
 

What's hot (20)

これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
 
30分で分かる!OSの作り方
30分で分かる!OSの作り方30分で分かる!OSの作り方
30分で分かる!OSの作り方
 
Vimから見たemacs
Vimから見たemacsVimから見たemacs
Vimから見たemacs
 
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~
 
Multibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだことMultibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだこと
 
HamaCTF WriteUp (Unpack category)
HamaCTF WriteUp (Unpack category)HamaCTF WriteUp (Unpack category)
HamaCTF WriteUp (Unpack category)
 
ワタシはSingletonがキライだ
ワタシはSingletonがキライだワタシはSingletonがキライだ
ワタシはSingletonがキライだ
 
Multi-Tenancy Kafka cluster for LINE services with 250 billion daily messages
Multi-Tenancy Kafka cluster for LINE services with 250 billion daily messagesMulti-Tenancy Kafka cluster for LINE services with 250 billion daily messages
Multi-Tenancy Kafka cluster for LINE services with 250 billion daily messages
 
20分でわかるgVisor入門
20分でわかるgVisor入門20分でわかるgVisor入門
20分でわかるgVisor入門
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
Jenkins と groovy
Jenkins と groovyJenkins と groovy
Jenkins と groovy
 
Nginx Unitを試してみた話
Nginx Unitを試してみた話Nginx Unitを試してみた話
Nginx Unitを試してみた話
 
Redmineのバージョンアップに追従していくための一工夫
Redmineのバージョンアップに追従していくための一工夫Redmineのバージョンアップに追従していくための一工夫
Redmineのバージョンアップに追従していくための一工夫
 
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったPHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作った
 
UnityでUI開発を高速化した件
UnityでUI開発を高速化した件UnityでUI開発を高速化した件
UnityでUI開発を高速化した件
 
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
 
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
 

Viewers also liked

日本電子卒業生とPHPとsymfony
日本電子卒業生とPHPとsymfony日本電子卒業生とPHPとsymfony
日本電子卒業生とPHPとsymfony
Katsuhiro Ogawa
 

Viewers also liked (7)

Symfony2のイベントリスナーについて
Symfony2のイベントリスナーについてSymfony2のイベントリスナーについて
Symfony2のイベントリスナーについて
 
管理画面のアクセスコントロール
管理画面のアクセスコントロール 管理画面のアクセスコントロール
管理画面のアクセスコントロール
 
Doctrineアカンパターン
DoctrineアカンパターンDoctrineアカンパターン
Doctrineアカンパターン
 
日本電子卒業生とPHPとsymfony
日本電子卒業生とPHPとsymfony日本電子卒業生とPHPとsymfony
日本電子卒業生とPHPとsymfony
 
Symfony勉強会#9 form
Symfony勉強会#9 formSymfony勉強会#9 form
Symfony勉強会#9 form
 
こわくないSymfony2 - 業務で使って気づいた7つの良いところ
こわくないSymfony2 - 業務で使って気づいた7つの良いところこわくないSymfony2 - 業務で使って気づいた7つの良いところ
こわくないSymfony2 - 業務で使って気づいた7つの良いところ
 
Api設計
Api設計Api設計
Api設計
 

Similar to EventListener使いこなし術 - Symfony勉強会#10

Introduction of symfony development process & What's symfony 1.3?
Introduction of symfony development process & What's symfony 1.3?Introduction of symfony development process & What's symfony 1.3?
Introduction of symfony development process & What's symfony 1.3?
Kousuke Ebihara
 
Symfony2 チュートリアル イントロダクション osc 2011 nagoya
Symfony2 チュートリアル イントロダクション osc 2011 nagoyaSymfony2 チュートリアル イントロダクション osc 2011 nagoya
Symfony2 チュートリアル イントロダクション osc 2011 nagoya
Hidenori Goto
 
Using Symfony Templating On Symfony 1
Using Symfony Templating On Symfony 1Using Symfony Templating On Symfony 1
Using Symfony Templating On Symfony 1
Kousuke Ebihara
 

Similar to EventListener使いこなし術 - Symfony勉強会#10 (10)

Symfony 1.4 TIPS from Openpne Source Code
Symfony 1.4 TIPS from Openpne Source CodeSymfony 1.4 TIPS from Openpne Source Code
Symfony 1.4 TIPS from Openpne Source Code
 
Introduction of symfony development process & What's symfony 1.3?
Introduction of symfony development process & What's symfony 1.3?Introduction of symfony development process & What's symfony 1.3?
Introduction of symfony development process & What's symfony 1.3?
 
Symfony2 チュートリアル イントロダクション osc 2011 nagoya
Symfony2 チュートリアル イントロダクション osc 2011 nagoyaSymfony2 チュートリアル イントロダクション osc 2011 nagoya
Symfony2 チュートリアル イントロダクション osc 2011 nagoya
 
Symfony2 intro-20111204
Symfony2 intro-20111204Symfony2 intro-20111204
Symfony2 intro-20111204
 
Symfony updates
Symfony updatesSymfony updates
Symfony updates
 
Using Symfony Templating On Symfony 1
Using Symfony Templating On Symfony 1Using Symfony Templating On Symfony 1
Using Symfony Templating On Symfony 1
 
Symfony2 workshop-1
Symfony2 workshop-1Symfony2 workshop-1
Symfony2 workshop-1
 
KLab Social Game Platform ~Symfony1.4活用事例~
KLab Social Game Platform ~Symfony1.4活用事例~KLab Social Game Platform ~Symfony1.4活用事例~
KLab Social Game Platform ~Symfony1.4活用事例~
 
Symfony2 introduction
Symfony2 introductionSymfony2 introduction
Symfony2 introduction
 
第4回Symfony2勉強会 基礎編ワークショップ.0
第4回Symfony2勉強会 基礎編ワークショップ.0第4回Symfony2勉強会 基礎編ワークショップ.0
第4回Symfony2勉強会 基礎編ワークショップ.0
 

Recently uploaded

Recently uploaded (11)

Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 

EventListener使いこなし術 - Symfony勉強会#10