LoginSignup
3
4

More than 3 years have passed since last update.

Laravel でファサードを禁止されたときにすること

Last updated at Posted at 2020-04-07

はじめに

Laravel はアーキテクチャの自由度が高い点でユニークなフレームワークに思う。

しかしチームで開発する上では、実装者によって書き方やアーキテクチャが変わりやすい点もある。

加えて MVC アーキテクチャだけではモデルやコントローラが太りやすい。

そんななか弊社で「DIに基づいた設計を行う」「ファーサードの使用は違法」とする「設計勧告案」が登場した。

でもあまり順守されていないように思うので、私の理解を書く。

なぜ DI か

ファサードは簡単に使える。

自分で取り込んだり、設定したりする必要があり、長くて覚えにくいクラス名を使わずに、Laravelの機能を簡素で覚えやすい文法で使ってもらえます。その上に、PHPの動的メソッドのユニークな使用方法のおかげで、簡単にテストができます。
https://readouble.com/laravel/6.x/ja/facades.html#when-to-use-facades

DI なら同じテスタビリティで、
クラスの依存関係を明示して、「大きなコンストラクタの視覚的なフィードバック」を得られる。

ファサードの一番の危険性は、クラスの責任範囲の暴走です。ファサードはとても簡単に使用でき依存注入も必要ないため、簡単にクラスが成長し続ける結果、一つのクラスで多くのファサードが使われます。依存注入を使用すればクラスが大きくなりすぎることに伴う、大きなコンストラクタの視覚的なフィードバックにより、この危険性は抑制されます。
https://readouble.com/laravel/6.x/ja/facades.html#facades-vs-dependency-injection

依存関係が増えてコンストラクタが大きくなったら、クラスをわけるサイン。
またはコンストラクタに小さく収まる単位にクラスの責任範囲をわけるとも言える。

ヘルパは?

ヘルパもファサードと同じ利点・欠点を持ち、同様に禁止されると考える。

どう使うか

ファサードとクラスなら公式に対応表があります。

Carbon

Illuminate\Support\DateFactory が使えます。
Carbon\Carbon, Carbon\CarbonImmutable と異なり、デフォルトの実装を順守してどちらかを返します。

ヘルパ

ソースコードを見て必要なクラスを探す。

https://github.com/laravel/framework/blob/6.x/src/Illuminate/Support/helpers.php
https://github.com/laravel/framework/blob/6.x/src/Illuminate/Foundation/helpers.php

わかりづらいのであとで対応表を書くかもしれない。
対応表を書きました。
Laravel 6.x ヘルパ DI クラス一覧 - Qiita

おわりに

DI を使うことでクラスの依存関係を明示し、適度な責任範囲を保てる。

統一的に使われれば、ビジネスロジックを集約でき、よりメンテナンスしやすくなると思われる。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4