Laravelでfacadeを使わない開発

187 views

Published on

since 2017/06/23

Published in: Software
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
187
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Laravelでfacadeを使わない開発

  1. 1. LaravelでFacadeを使わない開発 kenjiro kubota 2017/06/23
  2. 2. Profile Kenjiro Kubota istyle.inc  PHP, HHVM/Hack, Javascript  DTPDesigner WebDesigner FrontEnginner WebApplicationEngiiner﴾now﴿
  3. 3. みなさんLaravel使ってますか?
  4. 4. Facade使ってますか?
  5. 5. LaravelにおけるFacadeとは Facadeはサービスコンテナで利用可能なクラスへの ''static'' イ ンタフェースを提供 Facadeはサービスコンテナからオブジェクトへのアクセスを 提供するクラス デザインパターンのファサードパターンのことではありません。
  6. 6. こういうやつです Route::get(); Input::get();
  7. 7. スタティックでどこからでも呼び出せる
  8. 8. めっちゃ便利
  9. 9. そう思っていた時期が私にもありました
  10. 10. しかし複数人で開発していく上で 弊害になることも・・・
  11. 11. 例えば @if (Input::has('hoge'))     <p>hogeがあるよ</p> @endif Viewテンプレートでリクエストパラメータ値を評価したり ﴾これはまだましかも﴿
  12. 12. とか class hogeController extend Controller {     public function insertHoge(): int     {         return DB::table('hoge')                    ‐>insertGetId(['fuga' => 'piyo']);     } } コントローラーでデータアクセス層が出てきたり
  13. 13. 最悪なのが class UserStorage {     public function insert(array $array): bool     {         $hoge = Input::get('hoge');         ...     } } 逆にデータアクセス層でHttpリクエストを取得していたり
  14. 14. たとえしっかり設計していても どこでも呼べてしまうFacadeに汚染される可能性がある
  15. 15. 破綻の日は近いぞ
  16. 16. というわけで、Facadeをあえて封印して開発してみよう
  17. 17. まずはエイリアスを消してしまおう  config/app.php  'aliases' => [     'App' => IlluminateSupportFacadesApp::class,     'Artisan' => IlluminateSupportFacadesArtisan::class,     'Auth' => IlluminateSupportFacadesAuth::class,     'Blade' => IlluminateSupportFacadesBlade::class,     ~~~ ],
  18. 18. 次は元から絶ってしまおう  bootstrap/app.php  $app‐>singleton(     IlluminateContractsHttpKernel::class,     AppHttpKernel::class ); $app‐>singleton(     IlluminateContractsConsoleKernel::class,     AppConsoleKernel::class );
  19. 19.  AppHttpKernel::class  が継承してる  use IlluminateFoundationHttpKernel as HttpKernel;  protected $bootstrappers = [     IlluminateFoundationBootstrapLoadEnvironmentVariables::class     IlluminateFoundationBootstrapLoadConfiguration::class,     IlluminateFoundationBootstrapHandleExceptions::class,     IlluminateFoundationBootstrapRegisterFacades::class,     IlluminateFoundationBootstrapRegisterProviders::class,     IlluminateFoundationBootstrapBootProviders::class, ];  RegisterFacades を消したいので↑をコピーして
  20. 20.  AppHttpKernel::class  protected $bootstrappers = [     IlluminateFoundationBootstrapLoadEnvironmentVariables::class     IlluminateFoundationBootstrapLoadConfiguration::class,     IlluminateFoundationBootstrapHandleExceptions::class,     IlluminateFoundationBootstrapRegisterProviders::class,     IlluminateFoundationBootstrapBootProviders::class, ];  RegisterFacades をなかったことにしてオーバーライド ※Consoleも同様に
  21. 21. もうこのLaravelからFacadeは呼べなくなりました
  22. 22. ...あれ? Facadeが使えないとAuthとかSessionとかどうするの?
  23. 23. 実体をそのまま呼び出せばOK
  24. 24. Auth::なら use IlluminateAuthAuthManager; public function __construct(AuthManager $authManager) {     $this‐>auth = $authManager‐>guard('web'); }
  25. 25. Session::なら use IlluminateSessionSessionManager; public function __construct(SessionManager $sessionManager) {     $this‐>session = $sessionManager‐>driver('memcached'); }
  26. 26. Input::は use IlluminateHttpRequest; public function __invoke(Request $request) {     $input = $request‐>all(); }
  27. 27. Log::は特に簡単 use PsrLogLoggerInterface; public function __construct(LoggerInterface $logger) {     $this‐>logger = $logger; } PSR‐3のLoggerInterfaceにIlluminateLogWriter﴾Monolog﴿がバインドさ れているのでコンストラクタインジェクションで入る
  28. 28. 簡単ですね
  29. 29. 依存しているものはuseを見ればわかる ‐> 破綻しにくい
  30. 30. 実はちょっと落とし穴が...
  31. 31.  database/migrations/2014_10_12_000000_create_users_table.php  use IlluminateSupportFacadesSchema; ... public function up() {     Schema::create('users', function (Blueprint $table) {         $table‐>increments('id');         $table‐>string('name');         $table‐>string('email')‐>unique();         $table‐>string('password');         $table‐>rememberToken();         $table‐>timestamps();     }); }
  32. 32. LaravelのデフォルトのマイグレーションでFacadeを使ってるの に $bootstrappers から消し去ったので動かなくなります
  33. 33. こういうtraitを用意して trait Helper {     /**      * @return IlluminateDatabaseSchemaBuilder      */     protected function getSchemeBuilder()     {         return app('db')‐>connection($this‐>getConnection())             ‐>getSchemaBuilder();     }    }
  34. 34. こんな感じでやればOKです public function up() {     $this‐>getSchemeBuilder()         ‐>create('users', function (Blueprint $table) {             $table‐>increments('id');         }); } 拙作のリポジトリで参考が置いてあるのでパクってください。 https://github.com/kubotak‐is/laravel‐web‐site‐boilerplate
  35. 35.  app/Providers/AuthServiceProvider.php も死ぬ  app/Providers/BroadcastServiceProvider.php も死ぬ  app/Providers/EventServiceProvider.php も死ぬ これらは継承元のServiceProviderでFacadeを使っているので各親 を継承しないようにして自前で書いてください。 これも拙作のリポジトリで参考が置いてあるのでパクってください。 https://github.com/kubotak‐is/laravel‐web‐site‐boilerplate
  36. 36. まとめ LaravelのFacadeは便利だけど多様すると見通しが悪い Facadeを使わなくても特に困らない とはいえ便利なので小規模なアプリや個人的に使う分には良 いのでは 余談ですが弊社にはFacade警察が居るのでFacadeを使うとレ ビューで煽られます
  37. 37. おわり

×
Save this presentationTap To Close