laravel の中核はサービス コンテナ、つまり IOC コンテナです。コンテナーは、依存関係の注入や制御の反転など、フレームワーク全体で必要な一連のサービスを提供します。制御の反転は、コンピューター コード間の結合を減らすために使用できるオブジェクト指向プログラミングの設計原則です。
#この記事の動作環境: Windows 10 システム、Laravel バージョン 6、Dell G3 コンピューター。
IOC コンテナとも呼ばれるサービス コンテナには、実際には依存関係注入 (DI) と制御反転 (IOC) の 2 つの部分が含まれています。 Laravelのコア。 Route (ルーティング)、Eloquent ORM (データベース ORM コンポーネント)、Request and Response (リクエストとレスポンス) など、その他のさまざまな機能モジュールは、実際にはコアとは関係のないクラス モジュールによって提供され、これらのクラスが登録されます。 from インスタンス化から最終的な使用まで、laravel のサービスコンテナが実際に責任を負います。サービス コンテナの概念は明確に説明するのが難しく、サービス コンテナの歴史から段階的に説明するしかありません。
このコンテナはフレームワーク全体で必要な一連のサービスを提供します。
IoC コンテナ誕生の物語 - 石器時代 (オリジナル モード)
私たちは「スーパーマン」を 1 つのクラスとして捉えます。
class Superman {}
スーパーマンは生まれたときに少なくとも 1 つのスーパーパワーを持っているはずだと想像できます。このスーパーパワーはオブジェクトに抽象化することもできます。スーパーマンを説明するためにこのオブジェクトのクラスを定義しましょう。超大国には複数の属性と(操作)方法が必要です。これについては自由に想像できますが、ここでは属性だけを持つ「超大国」を大まかに定義します。何ができるかについては、後で詳しく説明します。
class Power { /** * 能力值 */ protected $ability; /** * 能力范围或距离 */ protected $range; public function __construct($ability, $range) { $this->ability = $ability; $this->range = $range; } }
class Superman { protected $power; public function __construct() { $this->power = new Power(999, 100); } }
エネルギー爆弾の属性には、ダメージ値、射撃距離、同時射撃数が含まれます。次のカテゴリを作成しました:
class Flight { protected $speed; protected $holdtime; public function __construct($speed, $holdtime) {} } class Force { protected $force; public function __construct($force) {} } class Shot { protected $atk; protected $range; protected $limit; public function __construct($atk, $range, $limit) {} }
class Superman { protected $power; public function __construct() { $this->power = new Fight(9, 100); // $this->power = new Force(45); // $this->power = new Shot(99, 50, 2); /* $this->power = array( new Force(45), new Shot(99, 50, 2) ); */ } }
class SuperModuleFactory { public function makeModule($moduleName, $options) { switch ($moduleName) { case 'Fight': return new Fight($options[0], $options[1]); case 'Force': return new Force($options[0]); case 'Shot': return new Shot($options[0], $options[1], $options[2]); } } }
这时候,超人 创建之初就可以使用这个工厂!
class Superman { protected $power; public function __construct() { // 初始化工厂 $factory = new SuperModuleFactory; // 通过工厂提供的方法制造需要的模块 $this->power = $factory->makeModule('Fight', [9, 100]); // $this->power = $factory->makeModule('Force', [45]); // $this->power = $factory->makeModule('Shot', [99, 50, 2]); /* $this->power = array( $factory->makeModule('Force', [45]), $factory->makeModule('Shot', [99, 50, 2]) ); */ } }
可以看得出,我们不再需要在超人初始化之初,去初始化许多第三方类,只需初始化一个工厂类,即可满足需求。但这样似乎和以前区别不大,只是没有那么多 new 关键字。其实我们稍微改造一下这个类,你就明白,工厂类的真正意义和价值了。
class Superman { protected $power; public function __construct(array $modules) { // 初始化工厂 $factory = new SuperModuleFactory; // 通过工厂提供的方法制造需要的模块 foreach ($modules as $moduleName => $moduleOptions) { $this->power[] = $factory->makeModule($moduleName, $moduleOptions); } } } // 创建超人 $superman = new Superman([ 'Fight' => [9, 100], 'Shot' => [99, 50, 2] ]);
现在修改的结果令人满意。现在,“超人” 的创建不再依赖任何一个 “超能力” 的类,我们如若修改了或者增加了新的超能力,只需要针对修改 SuperModuleFactory 即可。
【相关推荐:laravel视频教程】
以上がLaravelのコアとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。