ホームページ > バックエンド開発 > PHPチュートリアル > Laravelサービスコンテナを使用する利点

Laravelサービスコンテナを使用する利点

不言
リリース: 2023-04-02 16:40:02
オリジナル
2396 人が閲覧しました

この記事では主に、一定の参考価値のあるLaravelサービスコンテナを使用するメリットを紹介しますので、皆さんにもシェアしますので、困っている方は参考にしてください

コアについて話すならlaravelフレームワークとは何かというと、それは間違いなくサービスコンテナです。サービスコンテナの概念を理解することはlaravelを使う上で非常に重要であり、サービスコンテナの概念を理解することはlaravelを始めるかどうかを分ける重要な条件と言えるでしょう。それは、フレームワーク全体がサービス コンテナーに基づいて構築されているためです。

Laravelサービスコンテナを使用する利点laravel サービス コンテナは高度に自動化された工場のようなもので、必要なものは何でもモデルをカスタマイズし、特定のインターフェイスを使用して製造できます。

laravel ではサービスコンテナを使用するため、ほとんどのオブジェクトのインスタンス化方法は次のようになります:

$obj1 = $container->make('class1', 'class2');
$obj2 = $container->make('class3', 'class4');
ログイン後にコピー

ただし、サービスコンテナを使用せずに次の方法でも実行できます::

$obj1 = new class1(new class2());
$obj2 = new class3(new class4());
ログイン後にコピー

では、サービス コンテナーを使用する利点は何でしょうか?

例 1. メールの送信

メール送信機能をクラスにカプセル化し、必要に応じてインスタンスを作成し、Send メソッドを呼び出します。

laravel サービス コンテナを使用しない一般的な方法は次のとおりです:

/**
 *发送邮件服务类
 */
class EmailService{
    public function send(){
        //todo 发送邮件方法
    }
}

//如果任何地方要发邮件我们就复制下面这两行代码
$emailService = new EmailService();
$emailService->send();
ログイン後にコピー

laravel サービス コンテナを使用した後:

$this->app->bind('emailService', function ($app) {
    return new EmailService();
});

//如果任何地方要发邮件我们就复制下面这两行代码
$emailService = app('emailService');
$emailService->send();
ログイン後にコピー

これにより、コードがより簡潔になり、中間層のおかげで、柔軟性が向上 (分離) されるため、テスト (テスト中にクラスを偽装して EmailService クラスを置き換えることができます) であっても、EmailService クラスの最適化であっても、より便利になります。

//只需要改这一个地方
$this->app->bind('emailService', function ($app) {
    return new SupperEmailService();
});
ログイン後にコピー

他の呼び出し部分にはまったく触れる必要がありません。このバインディング操作がない場合、メール サービスが使用されるすべての場所で変更を加える必要があります。

//使用到EamilSerice类的每个地方都要更改
$emailService = new SupperEmailService();
$emailService->send();
ログイン後にコピー

例 2、シングルトン モードの実装

上記の例でも、パフォーマンス上の理由から、シングルトン モードを実装するには SupperEamilService クラスが必要なので、laravel サービス コンテナを使用せずに、次のように変更します。 SupperEmailService クラスを次のように記述します。

class SupperEamilService{
      //创建静态私有的变量保存该类对象
     static private $instance;
   
      //防止直接创建对象
      private function __construct(){
         
     }
         //防止克隆对象
     private function __clone(){
 
     }
     static public function getInstance(){
                 //判断$instance是否是Uni的对象
                 //没有则创建
         if (!self::$instance instanceof self) {
             self::$instance = new self();
         }
         return self::$instance;
         
     }
     
     //发送邮件方法
     public function send(){
        
     }
 }
ログイン後にコピー

さらに、SupperEamilService クラスのコンストラクターがプライベートになったため、 new キーワードを使用してオブジェクトをインスタンス化することはできません。そのため、SupperEmailService クラスがインスタンス化されるすべての場所で、これを次のように変更します。

$emailService=SupperEmailService::getInstance();
$emailService->send();
ログイン後にコピー

laravel サービス コンテナは自然にシングルトンをサポートします。laravel がそれを実装する方法は次のとおりです:

//只需要把bind改成singleton 
$this->app->singleton('emailService', function ($app) {
    return new SupperEmailService();
});
ログイン後にコピー

シングルトンを実装するには、コードを 1 行変更し、元のバインド メソッドを置き換えるだけです。 . これをシングルトンに変更すると、コンテナを通して取り出されるものがシングルトンになるのでとても便利です。

例 3、旅行者が旅行に行く

この例では、旅行者がチベットに行くことを想定しており、電車 (電車) または徒歩 (徒歩) を利用できます。

laravel サービスコンテナは使用しないでください:

<?php

interface TrafficTool
{
  public function go();
}

class Train implements TrafficTool
{

  public function go()
  {
  echo "train....";
  }
}

class Leg implements TrafficTool
{
  public function go()
  {
  echo "leg..";
  }
}

class Traveller
{
  /**
  * @var Leg|null|Train
  * 旅行工具
  */
  protected $_trafficTool;

  public function __construct(TrafficTool $trafficTool)
  {
  $this->_trafficTool = $trafficTool;
  }

  public function visitTibet()
  {
  $this->_trafficTool->go();
  }
}
ログイン後にコピー

旅行者が電車で旅行したいときは、通常次のように書きます:

<?php
 $train = new Train();
$tra = new Traveller($train);
$tra->visitTibet();
ログイン後にコピー

実際、この書き方はすでに非常に優れています。旅行ツールであるため、依存関係はインターフェイスを通じて外部に転送されています。ただし、new を使用してオブジェクトをインスタンス化する場合、依存関係は引き続き発生します。たとえば、上記の $tra = new Traveller($trafficTool) は、Traveller を作成する前に $trafficTool が必要であることを意味します。つまり、Traveler は TrafficTool に依存します。新しいものを使用する Traveller をインスタンス化するとき、Traveler と TrafficTool の間に結合が存在するため、これら 2 つのコンポーネントを分離することはできません。

次に、laravel サービス コンテナを使用して実装する方法を見てみましょう。

サービス コンテナ内のクラスのバインド

<?php
namespace App\Providers;

use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;

class RepositoryServiceProvider extends ServiceProvider
{
  public function register()
  {
     //在服务容器中绑定类
     $this->app->bind( &#39;TrafficTool&#39;, &#39;Train&#39;);
     $this->app->bind(&#39;Traveller&#39;, &#39;Traveller&#39;);
  }
}
ログイン後にコピー

オブジェクトのインスタンス化

<?php
// 实例化对象
$tra = app()->make(&#39;Traveller&#39;);
$tra->visitTibet();
ログイン後にコピー

使用するときサービス コンテナがトラベル クラス オブジェクトを取得すると、コンテナはオブジェクトに必要なパラメータを自動的に挿入します。それまでは、特定のクラスをバインドするだけで済みましたが、これは真の自動化を反映し、旅行クラスと旅行ツール クラスを完全に分離しました。移動方法を変更する必要がある場合は、バインディングを変更するだけで済みます。

まとめ

上にいくつかの簡単な例を示しましたが、laravelサービスコンテナを十分に理解して使いこなすことができれば、実際の開発においてより便利になります。もちろん完璧ではありませんので、欠点については次回のブログで説明しますが、要するに、実際に使用する際に長所を最大限に活かし、短所を回避することが重要です。

上記がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

Docker compose を使用した Laravel アプリケーションのオーケストレーション

Laravel の初期インストール

以上がLaravelサービスコンテナを使用する利点の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート