Enviar búsqueda
Cargar
Laravel aspectで関心の分離
•
1 recomendación
•
2,403 vistas
K
Kenjiro Kubota
Seguir
since 2017/07/08
Leer menos
Leer más
Software
Denunciar
Compartir
Denunciar
Compartir
1 de 31
Descargar ahora
Descargar para leer sin conexión
Recomendados
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
torisoup
名は体を表していますか
名は体を表していますか
infinite_loop
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
pospome
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
Recruit Lifestyle Co., Ltd.
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
増田 亨
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
Tetsutaro Watanabe
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips
Kenjiro Kubota
Recomendados
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
torisoup
名は体を表していますか
名は体を表していますか
infinite_loop
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
pospome
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
Recruit Lifestyle Co., Ltd.
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
増田 亨
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
Tetsutaro Watanabe
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips
Kenjiro Kubota
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
Dockerが抱えるネットワークの課題
Dockerが抱えるネットワークの課題
Asuka Suzuki
게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP Adv
Seungmo Koo
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
Tadahiro Ishisaka
Ruby test double
Ruby test double
Naotoshi Seo
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Yoshifumi Kawai
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
MagicOnion入門
MagicOnion入門
torisoup
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
Koichiro Matsuoka
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
disc99_
"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy
Kent Ohashi
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
MITSUNARI Shigeo
ソフトウェア設計の学び方を考える
ソフトウェア設計の学び方を考える
増田 亨
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
gree_tech
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
これでBigQueryをドヤ顔で語れる!BigQueryの基本
これでBigQueryをドヤ顔で語れる!BigQueryの基本
Tomohiro Shinden
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
いまどき(これから)のPHP開発
いまどき(これから)のPHP開発
Kenjiro Kubota
アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演)
Kenjiro Kubota
Más contenido relacionado
La actualidad más candente
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
Dockerが抱えるネットワークの課題
Dockerが抱えるネットワークの課題
Asuka Suzuki
게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP Adv
Seungmo Koo
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
Tadahiro Ishisaka
Ruby test double
Ruby test double
Naotoshi Seo
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Yoshifumi Kawai
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
MagicOnion入門
MagicOnion入門
torisoup
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
Koichiro Matsuoka
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
disc99_
"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy
Kent Ohashi
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
MITSUNARI Shigeo
ソフトウェア設計の学び方を考える
ソフトウェア設計の学び方を考える
増田 亨
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
gree_tech
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
これでBigQueryをドヤ顔で語れる!BigQueryの基本
これでBigQueryをドヤ顔で語れる!BigQueryの基本
Tomohiro Shinden
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
La actualidad más candente
(20)
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Dockerが抱えるネットワークの課題
Dockerが抱えるネットワークの課題
게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP Adv
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
Ruby test double
Ruby test double
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
MagicOnion入門
MagicOnion入門
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
ソフトウェア設計の学び方を考える
ソフトウェア設計の学び方を考える
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
これでBigQueryをドヤ顔で語れる!BigQueryの基本
これでBigQueryをドヤ顔で語れる!BigQueryの基本
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
Más de Kenjiro Kubota
いまどき(これから)のPHP開発
いまどき(これから)のPHP開発
Kenjiro Kubota
アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演)
Kenjiro Kubota
gRPC入門
gRPC入門
Kenjiro Kubota
アイスタイル特設サイトにおけるVue.jsの導入事例
アイスタイル特設サイトにおけるVue.jsの導入事例
Kenjiro Kubota
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
Kenjiro Kubota
フロントエンドエンジニアが知るべきFirebaseの世界
フロントエンドエンジニアが知るべきFirebaseの世界
Kenjiro Kubota
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
Kenjiro Kubota
カメラを利用したアプリを作って約1000人で遊んだ話
カメラを利用したアプリを作って約1000人で遊んだ話
Kenjiro Kubota
FirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見た
Kenjiro Kubota
introducing vue-wait-component
introducing vue-wait-component
Kenjiro Kubota
HHVM/Hackを本番投入した話
HHVM/Hackを本番投入した話
Kenjiro Kubota
HackのAsyncCurlで死んだ話
HackのAsyncCurlで死んだ話
Kenjiro Kubota
LaravelでAPI定義を管理する
LaravelでAPI定義を管理する
Kenjiro Kubota
2017: A CSS Design Odyssey
2017: A CSS Design Odyssey
Kenjiro Kubota
Introducing hhvm hack-async
Introducing hhvm hack-async
Kenjiro Kubota
Responsableを使ったadr実装
Responsableを使ったadr実装
Kenjiro Kubota
土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!
Kenjiro Kubota
Viewを活用して複雑化と戦う
Viewを活用して複雑化と戦う
Kenjiro Kubota
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
Kenjiro Kubota
Más de Kenjiro Kubota
(19)
いまどき(これから)のPHP開発
いまどき(これから)のPHP開発
アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演)
gRPC入門
gRPC入門
アイスタイル特設サイトにおけるVue.jsの導入事例
アイスタイル特設サイトにおけるVue.jsの導入事例
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
フロントエンドエンジニアが知るべきFirebaseの世界
フロントエンドエンジニアが知るべきFirebaseの世界
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
カメラを利用したアプリを作って約1000人で遊んだ話
カメラを利用したアプリを作って約1000人で遊んだ話
FirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見た
introducing vue-wait-component
introducing vue-wait-component
HHVM/Hackを本番投入した話
HHVM/Hackを本番投入した話
HackのAsyncCurlで死んだ話
HackのAsyncCurlで死んだ話
LaravelでAPI定義を管理する
LaravelでAPI定義を管理する
2017: A CSS Design Odyssey
2017: A CSS Design Odyssey
Introducing hhvm hack-async
Introducing hhvm hack-async
Responsableを使ったadr実装
Responsableを使ったadr実装
土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!
Viewを活用して複雑化と戦う
Viewを活用して複雑化と戦う
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
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 :﴿
Descargar ahora