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のロジックに依存することで、実際の処理を自由にカスタマイズできるようにしている。

これが、コントラクトが実現する疎結合なコードである。

 

以上!!!!!!!