この記事では主に、一定の参考価値のある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( 'TrafficTool', 'Train'); $this->app->bind('Traveller', 'Traveller'); } }オブジェクトのインスタンス化
<?php // 实例化对象 $tra = app()->make('Traveller'); $tra->visitTibet();使用するときサービス コンテナがトラベル クラス オブジェクトを取得すると、コンテナはオブジェクトに必要なパラメータを自動的に挿入します。それまでは、特定のクラスをバインドするだけで済みましたが、これは真の自動化を反映し、旅行クラスと旅行ツール クラスを完全に分離しました。移動方法を変更する必要がある場合は、バインディングを変更するだけで済みます。 まとめ上にいくつかの簡単な例を示しましたが、laravelサービスコンテナを十分に理解して使いこなすことができれば、実際の開発においてより便利になります。もちろん完璧ではありませんので、欠点については次回のブログで説明しますが、要するに、実際に使用する際に長所を最大限に活かし、短所を回避することが重要です。 上記がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。 関連する推奨事項:
Docker compose を使用した Laravel アプリケーションのオーケストレーション
以上がLaravelサービスコンテナを使用する利点の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。