《laravel app()、laravel app()原理》
开头简述解决方案
在Laravel框架中,app()
是一个非常便捷且核心的辅助函数。它能够快速获取服务容器实例,从而方便地从容器中解析和获取各种类实例或者配置项等资源。当我们在开发过程中需要使用到服务容器时,通过 app()
函数可以简化操作流程,而理解其原理有助于我们更好地利用Laravel的服务提供者机制、依赖注入等功能。
一、app()的基本用法
1. 获取服务容器
最基本也是最常用的方式就是直接调用 app()
来获取服务容器实例:
php
$container = app();
此时 $container
就是一个实现了 IlluminateContractsContainerContainer
接口的对象,可以通过这个对象来解析其他类或执行更多与服务容器相关的操作。
2. 解析类实例
如果想要解析某个类的实例,例如 AppServicesUserService
类:
php
$userService = app('AppServicesUserService');
// 或者使用完全限定名
$userService = app(AppServicesUserService::class);
这种方式下,Laravel会根据服务容器中的绑定关系自动解析出该类的实例,并且会处理好类构造函数中的依赖注入。
二、app()的原理剖析
1. 辅助函数定义
app()
函数实际上是在 vendor/laravel/framework/src/Illuminate/Foundation/helpers.php
文件中定义的一个辅助函数:
php
if (! function<em>exists('app')) {
/**
* Get the available container instance.
*
* @param string|null $abstract
* @param array $parameters
* @return mixed|IlluminateFoundationApplication
*/
function app($abstract = null, array $parameters = [])
{
if (is</em>null($abstract)) {
return Container::getInstance();
}</p>
<pre><code> return Container::getInstance()->make($abstract, $parameters);
}
}
可以看到,如果只传入空参数,则返回服务容器实例;如果有指定要解析的类名或者其他抽象类型(如接口),则会调用容器的 make
方法来创建并返回对应的实例。
2. 容器初始化
服务容器在 Laravel 应用启动时就已经被初始化了。在 bootstrap/app.php
文件中,通过 new IlluminateFoundationApplication
创建了一个应用实例,这个实例同时也充当着服务容器的角色。然后在整个应用程序的生命周期内,这个容器会被不断填充各种服务提供者所提供的类和服务。
app()
函数是 Laravel 中非常实用的一个工具,它隐藏了服务容器复杂的内部逻辑,为开发者提供了简单易用的接口。了解其工作原理可以帮助我们更高效地构建基于 Laravel 的应用程序。