Laravel コントラクト 調べてみた
コントラクトとは
Laravel内のコアコンポーネント(よく使うやつ)で使われている関数をインターフェースとして定義したもの。
コアコンポーネントの関数をインターフェースとして定義し、実際の利用場面ではクラスをインターフェースに依存させることで、コンポーネント間の密結合をなくし、フレームワーク全体を疎結合にする役割を担っている。
要は、各クラスを実際の実装されているクラスに依存させるのではなく、関数の定義だけが行われているインターフェースに依存させることで、関数の処理などをカスタマイズできるようにすることだと思われ。
使用例
コアコンポーネントの1つであるIlluminate\Encryption\Encrypterを例に説明する
Illuminate\Encryption\Encrypterでは、コントラクトとしてIlluminate\Contracts\Encryption\Encrypterが使用されている。
つまり、Illuminate\Encryption\Encrypter内の必要な機能はIlluminate\Contracts\Encryption\Encrypter内にインターフェースとして定義されている。
そして、注目するのがIlluminate\Encryption\Encrypterの機能が使われているIlluminate\Session\EncryptedStoreである。
<?php namespace Illuminate\Session; use Illuminate\Contracts\Encryption\DecryptException; use Illuminate\Contracts\Encryption\Encrypter as EncrypterContract; use SessionHandlerInterface; class EncryptedStore extends Store { protected $encrypter; public function __construct($name, SessionHandlerInterface $handler, EncrypterContract $encrypter, $id = null) { $this->encrypter = $encrypter; parent::__construct($name, $handler, $id); } ・・・
Illuminate\Session\EncryptedStoreでは、Illuminate\Encryption\Encrypterの機能が使われているのだが、直接Illuminate\Encryption\Encrypterに依存させるのではなく、Illuminate\Contracts\Encryption\Encrypteに依存させることによって、機能を提供している。
その部分が、コントラクタの引数にあたる。
こうすることで、Illuminate\Encryption\Encrypterの機能そのものに依存するのではなく、Illuminate\Encryption\Encrypterのロジックに依存することで、実際の処理を自由にカスタマイズできるようにしている。
これが、コントラクトが実現する疎結合なコードである。
以上!!!!!!!