Submit Search
Laravel aspectで関心の分離
1 like
2,471 views
K
Kenjiro Kubota
since 2017/07/08
Software
Read more
1 of 31
Download now
Download to read offline
1
2
3
4
5
6
7
8
Most read
9
Most read
10
Most read
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
More Related Content
ODP
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
PPTX
つぶやきGLSLのススメ
notargs
PPTX
わかりづらいS3クロスアカウントアクセス許可に立ち向かおう
Takashi Toyosaki
PPTX
RLSを用いたマルチテナント実装 for Django
Takayuki Shimizukawa
PDF
[Cloud OnAir] Google Cloud における RDBMS の運用パターン 2020年11月19日 放送
Google Cloud Platform - Japan
PDF
AWSとReactで始めるShopifyアプリ開発
Takaaki Kurasawa
PDF
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
PDF
実践 NestJS
Ayumi Goto
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
つぶやきGLSLのススメ
notargs
わかりづらいS3クロスアカウントアクセス許可に立ち向かおう
Takashi Toyosaki
RLSを用いたマルチテナント実装 for Django
Takayuki Shimizukawa
[Cloud OnAir] Google Cloud における RDBMS の運用パターン 2020年11月19日 放送
Google Cloud Platform - Japan
AWSとReactで始めるShopifyアプリ開発
Takaaki Kurasawa
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
実践 NestJS
Ayumi Goto
What's hot
(20)
PDF
OpenID Connect 入門 〜コンシューマーにおけるID連携のトレンド〜
Masaru Kurahayashi
PDF
俺が考えた最強のID連携デザインパターン
Masaru Kurahayashi
PPTX
Apache Avro vs Protocol Buffers
Seiya Mizuno
PDF
BigQuery で 150万円 使ったときの話
itkr
PDF
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
PDF
Doma SQLテンプレートのしくみ
Toshihiro Nakamura
PDF
Laravelの認証について
Takeo Noda
PPTX
ここがつらいよ、Hyperledger Fabricの商用適用(Blockchain GIG #4発表資料)
NTT DATA Technology & Innovation
PPTX
IDaaS を利用すべき理由とエンジニアがおさえておくべきポイント (2021年1月14日)
Masanori KAMAYAMA
PDF
なぜOpenID Connectが必要となったのか、その歴史的背景
Tatsuo Kudo
PDF
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
Google Cloud Platform - Japan
PPTX
NGINXでの認可について考える
Hitachi, Ltd. OSS Solution Center.
PDF
DynamoDB設計のちょっとした技
Yoichi Toyota
PPTX
OpenVRやOpenXRの基本的なことを調べてみた
Takahiro Miyaura
PDF
中・大規模でLaravelを導入するTips
Kenjiro Kubota
PDF
Python におけるドメイン駆動設計(戦術面)の勘どころ
Junya Hayashi
PDF
Google Cloud Dataflow を理解する - #bq_sushi
Google Cloud Platform - Japan
PDF
M04_失敗しないための Azure Virtual Desktop 設計ガイド
日本マイクロソフト株式会社
PDF
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
Toru Yamaguchi
PDF
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
Takahito Tejima
OpenID Connect 入門 〜コンシューマーにおけるID連携のトレンド〜
Masaru Kurahayashi
俺が考えた最強のID連携デザインパターン
Masaru Kurahayashi
Apache Avro vs Protocol Buffers
Seiya Mizuno
BigQuery で 150万円 使ったときの話
itkr
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
Doma SQLテンプレートのしくみ
Toshihiro Nakamura
Laravelの認証について
Takeo Noda
ここがつらいよ、Hyperledger Fabricの商用適用(Blockchain GIG #4発表資料)
NTT DATA Technology & Innovation
IDaaS を利用すべき理由とエンジニアがおさえておくべきポイント (2021年1月14日)
Masanori KAMAYAMA
なぜOpenID Connectが必要となったのか、その歴史的背景
Tatsuo Kudo
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
Google Cloud Platform - Japan
NGINXでの認可について考える
Hitachi, Ltd. OSS Solution Center.
DynamoDB設計のちょっとした技
Yoichi Toyota
OpenVRやOpenXRの基本的なことを調べてみた
Takahiro Miyaura
中・大規模でLaravelを導入するTips
Kenjiro Kubota
Python におけるドメイン駆動設計(戦術面)の勘どころ
Junya Hayashi
Google Cloud Dataflow を理解する - #bq_sushi
Google Cloud Platform - Japan
M04_失敗しないための Azure Virtual Desktop 設計ガイド
日本マイクロソフト株式会社
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
Toru Yamaguchi
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
Takahito Tejima
Ad
More from Kenjiro Kubota
(19)
PDF
いまどき(これから)のPHP開発
Kenjiro Kubota
PDF
アイスタイル特設サイトにおけるVue.js導入事例(再演)
Kenjiro Kubota
PDF
gRPC入門
Kenjiro Kubota
PDF
アイスタイル特設サイトにおけるVue.jsの導入事例
Kenjiro Kubota
PDF
Akkaとは。アクターモデル とは。
Kenjiro Kubota
PDF
フロントエンドエンジニアが知るべきFirebaseの世界
Kenjiro Kubota
PDF
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
Kenjiro Kubota
PDF
カメラを利用したアプリを作って約1000人で遊んだ話
Kenjiro Kubota
PDF
FirebaseとNuxtでLPを作って見た
Kenjiro Kubota
PDF
introducing vue-wait-component
Kenjiro Kubota
PDF
HHVM/Hackを本番投入した話
Kenjiro Kubota
PDF
HackのAsyncCurlで死んだ話
Kenjiro Kubota
PDF
LaravelでAPI定義を管理する
Kenjiro Kubota
PDF
2017: A CSS Design Odyssey
Kenjiro Kubota
PDF
Introducing hhvm hack-async
Kenjiro Kubota
PDF
Responsableを使ったadr実装
Kenjiro Kubota
PDF
土日でLineみたいなチャット作ってきた!
Kenjiro Kubota
PDF
Viewを活用して複雑化と戦う
Kenjiro Kubota
PDF
Laravelでfacadeを使わない開発
Kenjiro Kubota
いまどき(これから)のPHP開発
Kenjiro Kubota
アイスタイル特設サイトにおけるVue.js導入事例(再演)
Kenjiro Kubota
gRPC入門
Kenjiro Kubota
アイスタイル特設サイトにおけるVue.jsの導入事例
Kenjiro Kubota
Akkaとは。アクターモデル とは。
Kenjiro Kubota
フロントエンドエンジニアが知るべきFirebaseの世界
Kenjiro Kubota
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
Kenjiro Kubota
カメラを利用したアプリを作って約1000人で遊んだ話
Kenjiro Kubota
FirebaseとNuxtでLPを作って見た
Kenjiro Kubota
introducing vue-wait-component
Kenjiro Kubota
HHVM/Hackを本番投入した話
Kenjiro Kubota
HackのAsyncCurlで死んだ話
Kenjiro Kubota
LaravelでAPI定義を管理する
Kenjiro Kubota
2017: A CSS Design Odyssey
Kenjiro Kubota
Introducing hhvm hack-async
Kenjiro Kubota
Responsableを使ったadr実装
Kenjiro Kubota
土日でLineみたいなチャット作ってきた!
Kenjiro Kubota
Viewを活用して複雑化と戦う
Kenjiro Kubota
Laravelでfacadeを使わない開発
Kenjiro Kubota
Ad
Laravel aspectで関心の分離
1.
LaravelAspectで関心の分離 KenjiroKubota 2017/07/08
2.
Profile Kenjiro Kubota istyle.inc PHP, HHVM/Hack, Javascript DTPDesigner WebDesigner FrontEnginner WebApplicationEngiiner﴾now﴿
3.
関心の分離とは 関心の分離(かんしんのぶんり、英語: separation of
concerns、SoC)とは、ソフトウェア工 学において、プログラムを機能面において可能な限り重複がない、複数の機構に明確に分割 することをいう。ここでいう「関心﴾関心事﴿」とは、プログラムのある機能や振る舞い、目的 のことである。﴾Wikipedia﴿
4.
Aspect﴾AOP﴿とは アスペクト指向プログラミング(アスペクトしこうプログラミング、Aspect Oriented Programming、AOP)は、オブジェクト指向ではうまく分離できない特徴(クラス間を横断 ﴾cross‐cutting﴿ するような機能)を「アスペクト」とみなし、アスペクト記述言語をもちいて 分離して記述することでプログラムに柔軟性をもたせようとする試み。アスペクトの例とし ては、データ転送帯域の制限や例外の処理などがある。Java
にアスペクト指向的要素を追加 したAspectJ が実験的に実装されている。﴾Wikipedia﴿
5.
横断的関心事を解決する手段
6.
代表的なケースはロギング、トランザクション、キャッシュなどが挙げられます
7.
Laravelで利用する際はRay.Aopを用いている以下のライブラリがオススメ(宣伝) ytake/laravel‐aspect
8.
利用ケース ロギング 普通はこんな感じ public function get($id) { Log::info($id); $this‐>logger‐>info($id); } Logファサードを使ったり、コンストラクトインジェクションしたloggerを使ったり...
9.
LaravelAspectを使うと use YtakeLaravelAspectAnnotationLoggable; class AspectLoggable { /** * @Loggable * @param null $id * @return null */ public function normalLog($id = null) { return $id; } }
10.
利用ケース トランザクション 普通はこんな感じ? public function save(array $params) { DB::beginTransaction(); try { $result = $this‐>eloquent‐>save($params); DB::commit(); return $result; } catch(Exception $e) { DB::rollback(); Log::error($e‐>getMessage()); throw $e; } }
11.
LaravelAspectなら use YtakeLaravelAspectAnnotationTransactional; /** * @Transactional("master") * @LogExceptions */ public function save(array $params) { return $this‐>eloquent‐>save($params); }
12.
アノテーションで関心の分離ができる
13.
他にもデフォルトで便利なアノテーションが用意されてます 詳しくはライブラリのREADEMEを見てください。
14.
LaravelAspectに用意されてるアノテーションも便利なんですが 自分たちのアプリに合わせた独自のアノテーションを作り たいですよね?
15.
サンプルケース 最終ログイン日時の記録
16.
まずはLaravelAspectを導入 $ composer require ‐‐no‐update ytake/laravel‐aspect && composer update
17.
Provider登録 config/app.php 'providers' => [ // added AspectServiceProvider YtakeLaravelAspectAspectServiceProvider::class, // added Artisan Command YtakeLaravelAspectConsoleServiceProvider::class, ]
18.
設定ファイルとかModulesをアプリケーションにコピー $ php artisan ytake:aspect‐module‐publish $ php artisan vendor:publish
19.
こんな感じで追加されます laravel ‐ app ‐ Modules ‐ CacheableModule.php ‐ CacheEvictModule.php ‐ CachePutModule.php ‐ TransactionalModule.php ‐ LoggableModule.php ‐ LogExceptionsModule.php ‐ PostConstructModule.php ‐ RetryOnFailureModule.php ‐ config ‐ ytake‐laravel‐aop.php
20.
独自アノテーションの定義
21.
use DoctrineCommonAnnotationsAnnotation; /** * @Annotation * @Target("METHOD") * Class LastLoginTime */ class LastLoginTime extends Annotation { // } アスペクト利用時は以下の様になる ‐> @LastLoginTime()
22.
インターセプターの定義 ※ アノテーションが実行されるときの挙動を定義
23.
use RayAopMethodInvocation; use RayAopMethodInterceptor; use YtakeLaravelAspectAnnotationAnnotationReaderTrait; class LastLoginTimeInterceptor implements MethodInterceptor { use AnnotationReaderTrait; /** * @param MethodInvocation $invocation * @return object */ public function invoke(MethodInvocation $invocation) { // before $result = $invocation‐>proceed(); // after $user = $result‐>getUser(); $lastLoginTime = app()‐>make(AppServiceLastLoginTime::class); if (!$lastLoginTime‐>update($user)) { throw new ErrorException("Failed Update Last Login Time"); } return $result; } }
24.
// before $result = $invocation‐>proceed(); // after beforeはアノテーションを記述したメソッドが実行される前に実行される。 afterはメソッド実行されたあとに実行される $resultにはそのメソッドの返り値が入ります。
25.
ポイントカットの定義 ※ 特定のアノテーションが実行されるときに起動されるインターセプターを定義
26.
class LastLoginTimePointCut extends CommonPointCut implements PointCutable { /** @var string */ protected $annotation = AppAnnotationLastLoginTime::class; /** * @param Container $app * @return RayAopPointcut */ public function configure(Container $app) { $this‐>setInterceptor(new LastLoginTimeInterceptor); return $this‐>withAnnotatedAnyInterceptor(); } }
27.
モジュールの追加 ※ アノテーションが利用されるクラスを定義する
28.
use AppAspectPointCutLastLoginTimePointCut; use YtakeLaravelAspectModulesAspectModule; class LastLoginTimeModule extends AspectModule { /** @var array */ protected $classes = [ AppHttpControllerLoginController::class, ]; /** * @return LastLoginTimePointCut */ public function registerPointCut() { return new LastLoginTimePointCut; } }
29.
最後にModulesを以下に登録してあげればOK config/ytake‐laravel‐aop.php 'modules' => [ ... // append modules AppModulesLastLoginTimeModule::class, ],
30.
まとめ LaravelAspectをとりあえず導入するだけでも楽々AOPが実現できる 拡張もできるので独自の要件にも対応できる 関心を分離することでいちクラスの責務を追求できるようになります 単一責任の原則
31.
thanks :﴿
Download