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

藏色散人
リリース: 2020-03-19 08:58:16
転載
2724 人が閲覧しました

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 を使用してオブジェクトをインスタンス化する場合も依存関係は発生します。たとえば、上記の TrafficTool など)、これは、Traveller を作成する前に $trafficTool が必要であることを意味します。つまり、Traveller は TrafficTool に依存します。new を使用して 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サービスコンテナを十分に理解して使いこなすことができれば、実際の開発においてより便利になります。 。もちろん完璧ではありませんので、欠点については次回のブログで説明しますが、要するに、実際に使用する際に長所を最大限に活かし、短所を回避することが重要です。

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

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!