この記事では主に、一定の参考価値のある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());
laravel サービス コンテナを使用しない一般的な方法は次のとおりです:
/** *发送邮件服务类 */ class EmailService{ public function send(){ //todo 发送邮件方法 } } //如果任何地方要发邮件我们就复制下面这两行代码 $emailService = new EmailService(); $emailService->send();
$this->app->bind('emailService', function ($app) { return new EmailService(); }); //如果任何地方要发邮件我们就复制下面这两行代码 $emailService = app('emailService'); $emailService->send();
//只需要改这一个地方 $this->app->bind('emailService', function ($app) { return new SupperEmailService(); });
//使用到EamilSerice类的每个地方都要更改 $emailService = new SupperEmailService(); $emailService->send();
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(){ } }
$emailService=SupperEmailService::getInstance(); $emailService->send();
//只需要把bind改成singleton $this->app->singleton('emailService', function ($app) { return new SupperEmailService(); });
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();
サービス コンテナ内のクラスのバインド
<?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();
Docker compose を使用した Laravel アプリケーションのオーケストレーション
以上がLaravelサービスコンテナを使用する利点の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。