ラーシェルでオブジェクトを作成するサービスコンテナの使用


最近、newキーワードを使用する代わりに、サービスコンテナを使用してオブジェクトを作成することについてつぶやきました.


ラーラヴエル
@ thelaraveldev

ララールチップ❌ 新しいキーワードを使ってオブジェクトを作成しない✅ サービスコンテナを使用して、クラスのインスタンスの作成方法を定義します.以下は例です.あなたが空想フレーズを好むならば、これは依存性注射です.
午前7時56分- 2022年2月11日
この記事では、サービスコンテナとその利点の一部を使用してオブジェクトを作成する方法を参照してください.
次のようにTransistorのクラスがあるとしましょう.
namespace App\Services;

class Transistor {
    public function __construct()
    {
    }
    .
    .
    .
}
さて、このクラスをコントローラのインデックスメソッドで使いたいなら、以下のようにします.
public function index()
{
    $transistor = new Transistor();
    .
    .    
}
しかし、Laravelがフードの下で動作するように、単に以下のようなトランジスタクラスを注入できます.
public function index(Transistor $transistor)
{
    //$transistor object will be available here.
    .
    .

}
Laravelは自動的にトランジスタクラスを解決することができ、我々のメソッド(これは依存注入としても知られています)にそれを注入することができます.
実際に、あなたはそれを知らずにも、このlaravel機能を使用している可能性があります.これまでどのようにRequestクラスは、コントローラのメソッドに注入されるだろう.
public function store(Request $request)
{
.
.    
}
現在、私たちのトランジスタクラスは、私たちが何を呼び出すか、ゼロの構成を持っています.さて、私たちのトランジスタクラスは、以下のようにコンストラクタを通してパラメータを期待します.
namespace App\Services;

class Transistor {
    public $key;

    public function __construct($key)
    {
        $this->key = $key;
    }
    .
    .
    .
}
私たちのトランジスタクラスがパラメタを予想するので、LaraVelは単独でクラスを解決することができません.このクラスを解決する方法については、Laravelに伝える必要があります.以下のようにAppServiceProviderにできます.
$this->app->bind(Transistor::class, function () {
    return new Transistor(config('settings.key'));
});
したがって、毎回、私たちは、トランジスタクラスを注入するよう頼みます.
Laravelサービスコンテナは他の多くのタイプの結合をサポートします.あなたはDocumentationでそれらをチェックすることができます.
さて、サービスコンテナを使用してクラスを解決する利点がいくつかあります.
  • コントローラはもはやオブジェクトを作成する責任がありません.私たちは、コントローラをコントローラに入れます、そして、コントローラはトランジスタ・クラスに関連したメソッドを呼ぶのに責任があります.これは多くの雑音を除去して、我々のコントローラをきれいにしておくのを助けます.
  • 私たちのトランジスタクラスの将来の実装が将来の場合、我々のトランジスタクラスは、コンストラクタを介して渡される別のパラメータを必要とします.サービスコンテナなしでは、トランジスタクラスが使用されているすべてのファイルで変更を行わなければなりません.
  • サービスコンテナを使用する
  • は、テストを使用してトランジスタクラスをモックアップするのは非常に簡単です.
  • $mock = $this->mock(Transistor::class, function (MockInterface $mock) {
        $mock->shouldReceive('fetchStations')->once();
    });
    
    これは、我々のトランジスタのクラスがサードパーティのAPIを打っているときにさらに便利であり、我々はテスト速度の制限を避けるためだけでなく、我々のテストを高速にするために我々のテスト中にAPIを押すことを避けたい.
    サービスコンテナーを使用しないと、トランジスタクラスをモックアップすることは容易ではありません.
    結論として、あなたがLALAVELでオブジェクトを作成するためにnewを使用しているなら、おそらくより良い方法があります.