SlideShare une entreprise Scribd logo
1  sur  35
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
 

Tendances (20)

MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
Redmineの開発状況のこれまでと現在
Redmineの開発状況のこれまでと現在Redmineの開発状況のこれまでと現在
Redmineの開発状況のこれまでと現在
 
View customize plugin for Redmineの紹介 (2019年版)
View customize plugin for Redmineの紹介 (2019年版)View customize plugin for Redmineの紹介 (2019年版)
View customize plugin for Redmineの紹介 (2019年版)
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
 
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
 
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
Redmineでメトリクスを見える化する方法
Redmineでメトリクスを見える化する方法Redmineでメトリクスを見える化する方法
Redmineでメトリクスを見える化する方法
 
Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介
 
【Unite Tokyo 2019】ゼロから始めるアラビア語レンダリング
【Unite Tokyo 2019】ゼロから始めるアラビア語レンダリング【Unite Tokyo 2019】ゼロから始めるアラビア語レンダリング
【Unite Tokyo 2019】ゼロから始めるアラビア語レンダリング
 
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovyJava開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovy
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
View customize pluginを使いこなす
View customize pluginを使いこなすView customize pluginを使いこなす
View customize pluginを使いこなす
 
【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう
 
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
 
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
 
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~
 

En vedette

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

En vedette (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設計
 

Similaire à 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
 

Similaire à 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
 

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