laravel では、make メソッドを使用してコンテナから型を解析します。型はソース コードで定義されます。解析後に返される結果は型のインスタンスです。コンテナ クラスが make メソッドを呼び出すと、メソッドがない場合、登録されたキーはリフレクション クラスを通じて具象クラスを自動的にインスタンス化します。
#この記事の動作環境: Windows 10 システム、Laravel バージョン 6、Dell G3 コンピューター。
Laravel の make メソッドは、コンテナから型を解析するために使用されます。この型はソース コードで定義されており、簡単には解析できません。中国語に翻訳します。解析後に返される結果は type のインスタンスです。
ソース コードを読んだ学生は、Illuminate\Foundation\Application クラスとその親クラス Illuminate\Container\Container クラスに make メソッドがあることを知っているはずで、インデックス内のこのコード行を実行します。 php ,
1 $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
、最初に Illuminate\Foundation\Application make メソッドを実行します。まずはそれを見てみましょう。 (この記事では make Kernel クラスを例に挙げます)
/** * Resolve the given type from the container. 从容器当中解析给定的type * * (Overriding Container::make) 覆盖了父类中的make方法 * * @param string $abstract 给定的type * @param array $parameters 指定一些参数 可选项 * @return mixed */ public function make($abstract, array $parameters = []) { $abstract = $this->getAlias($abstract);//调用父类中的getAlias方法 //如果在deferredServices这个数组设置了这个type并且在instances数组中没有设置这个type if (isset($this->deferredServices[$abstract]) && ! isset($this->instances[$abstract])) { $this->loadDeferredProvider($abstract);//那么就执行这个方法:加载被定义为延迟的服务提供者 } return parent::make($abstract, $parameters);//调用父类的make方法 }
わかりました、ステップごとに見ていきましょう。まず、getAlias メソッドを見てみましょう。このメソッドの機能は、エイリアスを返すことです。指定された場合、完全なクラス名でエイリアスに設定されている場合はクラス名のエイリアスが返され、設定されていない場合はクラス名そのものが返されます。メソッドの場合、最初に var_dump $app を実行して比較することができます。内部のエイリアス配列、フレームワーク作成者がこのメソッドを作成したのは非常に賢いもので、少なくともこの再帰メソッドは私の実際の開発ではほとんど使用されません。
/** * Get the alias for an abstract if available. * * @param string $abstract * @return string * * @throws \LogicException */ public function getAlias($abstract) { if (! isset($this->aliases[$abstract])) { return $abstract; } if ($this->aliases[$abstract] === $abstract) { throw new LogicException("[{$abstract}] is aliased to itself."); } return $this->getAlias($this->aliases[$abstract]); }
次のステップは、deferredServices とインスタンスの 2 つの配列を判断することです。この例では、 $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 結果は次のようになります。 false なので、loadDeferredProvider メソッドは実行されません。
次のステップでは、親クラス Illuminate\Container\Container の make メソッドを呼び出します。
/** * Resolve the given type from the container. * * @param string $abstract * @param array $parameters * @return mixed */ public function make($abstract, array $parameters = []) { return $this->resolve($abstract, $parameters);//直接调用resolve方法 }
[関連する推奨事項: laravel ビデオ チュートリアル ]
以上がLaravelのmakeメソッドの機能は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。