2015-11-23 15 views
11

私は4ヶ月以来laravelをやっています。ファサードと契約の間に明確な違いはありませんが、どちらもインターフェイスのセットになっています。ファサードの代わりに契約や契約の代わりにファサードを使うのはなぜですか?契約とファサードの違いlaravel

答えて

14

これらが両方のインターフェイスであるという事実は、私たちが2つのクラスを持っていた場合と同じではありません。

契約は、通常、あなたのコード内のある機能と発信者/クライアントとの間に厳密な境界を提供するインターフェイスを指す用語です。この契約は、機能に一貫したインターフェースを適用する方法です。原則として、契約を定義したら、変更しないでください。とにかく好きなようにインターフェイスを実装できる(あるいは異なる実装を入れ替えることもできます)が、クライアントは常に同じインターフェイスメソッドを使用します。実装を変更しても、クライアントコードに影響はありません。 基礎となる分類は、契約定義の影響を直接受けます。

ファサードは、コードの一部の機能をクライアントに単純化する方法です。私は多くのラベルファサード(RouteとRequestなど)が実際には多くの異なるクラス/インターフェースにマップされていると思います。クラスのどのクラスがどの仕事をしているかを覚えておく必要がなくなります。ファサードを呼び出してそれを処理させるだけです。

システムは相互に依存するクラスの数が多いか、そのソースコードが利用できないため、システムが理解することは非常に複雑で困難な場合ファサードデザインパターンは、しばしば使用されます。このパターンは、より大きいシステムの複雑さを隠し、クライアントへのより簡単なインターフェースを提供します。 wikipedia

私はlaravelがファサードでインターフェイスを使用していると考えていますが、インターフェイスは基本クラスを定義していません。実際には、基礎となるクラスメソッドのシグネチャが変更された場合、おそらく類似するようにファサードを書き換えることになります。 ファサードは、物事を簡単にするという厳しい契約をすることではありません。

UPDATE あなたが正しくあなたのコメントで識別される、Laravelファサードは、静的メソッドを持っています。コードを挿入することなくコード内で簡単に呼び出すことができます(テストの観点からは、これはひどい考えです)。 Laravel Facadesが静的であるという事実は、Laravelの実装選択です(すべてのLaravelクラスが静的であるL3に戻ります)。これはFacadesの厳密な定義とは関係ありません。

多分あなたの質問に対する答えはこれです - ファサードはL3の遺産です。 Laravelが静的なクラスを使うためには、ブログの投稿がたくさんあります。最終的に、laravel開発チームは両方のオプションを提供することにしました。

Iは多分Laravelに、上記契約およびファサードの厳密な定義を提供している一方で、単純な違いは、ファサードは静的クラスであり、契約がインスタンスクラスによって実装されることです。これは皆を幸せに保ちます。 Laravelのドキュメント

Laravel「ファサード」から

は、従来の静的よりもテスト容易性と柔軟性を維持しながら、簡潔な、表情豊かな構文の利点を提供する、サービスコンテナでの基本的なクラスへの「静的プロキシ」として機能しますメソッド。

+0

私のアプリでファサードを定義するのと同じことは、それではAuthのような簡単なタイプのヒントになります。それはクラスのすべてのメソッドで使いやすいので、我々は契約を使用する場合は、照明/契約/メーラを使用し、メソッドを注入する必要がありますので、毎回それらの型を入力して注入する必要があります –

+0

Laravelはすべての静的メソッドを持つファサード(laravel 3に戻る)。定義によるファサードは静的メソッドを持つ必要はなく、Laravelだけがこのように実装することに決めました。 –

+0

私はそれがlaravelの中で最も混乱していると思います。 –

関連する問題