在代码中获取到容器实例(Laravel)
发布时间 - 2021-08-06 00:00:00 点击率:次本文由laravel教程栏目给大家介绍怎么在代码中获取到容器实例,希望对需要的朋友有所帮助!
laravel容器实例在整个请求生命周期中都是唯一的,且管理着所有的服务组件实例。那么有哪些方式能够拿到laravel容器的实例呢?常用的有以下几种方式:
1) 通过app这个help函数:
$app = app();
app这个辅助函数定义在
文件里面,这个文件定义了很多help函数,并且会通过composer自动加载到项目中。所以,在参与http请求处理的任何代码位置都能够访问其中的函数,比如app()。
2)通过App这个Facade
通过App这个Facade拿容器实例的方式,跟上面不同的是,不能把App先赋给一个变量,然后通过变量来调用容器的方法。这是因为App相当于只是一个类名,我们不能把一个类名复制一个变量。$app = App;不是一个合法的可执行的语句,而$app = app();却是一个合法的可执行的语句,因为它后面有app(),表示函数调用。App::basePath();也是一个合法的语句,它就是在调用类的静态方法。
再补充2点:
第一点: Facade是laravel框架里面比较特殊的一个特性,每个Facade都会与容器里面的一个实例对象关联,我们可以直接通过Facade类静态方法调用的形式来调用它关联的实例对象的方法。比如App这个Facade,调用App::basePath()的时候,实际相当于app()->basePath()。
这个底层机制也是依赖于php语言的特性才能实现的,需要在每一个Facade里面,设定一个静态成员并关联到一个服务的实例对象,当调用Facade类的静态方法的时候,解析出调用的方法名,再去调用关联的服务实例的同名方法,最后把结果返回。
我认为理解Facade能起到什么作用就够了,不一定要深究到它底层去了解实现的细节,毕竟在实际的开发中,不用Facade,也完全不影响laravel框架的使用。另外在实际编码中,要自定义一个Facade也非常容易,只要继承laravel封装的Facade基类即可:
实现Facade基类的getFacadeAccessor方法,laravel框架就知道这个Facade类该与哪个服务实例关联起来了。实际上这个getFacadeAccess方法,返回的名称就是后面要介绍的服务绑定名称。在laravel容器里面,一个服务实例,都会有一个固定的绑定名称,通过这个名称就能找到这个实例。所以为啥Facade类只要返回服务绑定名称即可。
我们可以看看App这个Facade类的代码:
它的getFacadeAccessor返回的就是一个字符串“app”,这个app就是laravel容器自己绑定自己时用的名称。
第二点:从上一点最后App这个Facade的源码可以看出,App这个Facade的全类名其实是:Illuminate\Support\Facades\App,那为什么我们在代码里面能够直接通过App这个简短的名称就能访问到呢:
你看以上代码完全没有用到use或者完全限定的方式来使用Illuminate\Support\Facades\App。实际上App跟Illuminate\Support\Facades\App是完全等价的,只不过App比Illuminate\Support\Facades\App要简短很多,而且不需要use,所以用起来方便,那么它是怎么实现的?这跟laravel容器配置的别名有关系,在config/app.php中,
有一节aliases专门用来配置一些类型的别名:
'aliases' => [ 'App' => Illuminate\Support\Facades\App::class, 'Artisan' => Illuminate\Support\Facades\Artisan::class, 'Auth' => Illuminate\Support\Facades\Auth::class, 'Blade' => Illuminate\Support\Facades\Blade::class, 'Bus' => Illuminate\Support\Facades\Bus::class, 'Cache' => Illuminate\Support\Facades\Cache::class, 'Config' => Illuminate\Support\Facades\Config::class, 'Cookie' => Illuminate\Support\Facades\Cookie::class, 'Crypt' => Illuminate\Support\Facades\Crypt::class, 'DB' => Illuminate\Support\Facades\DB::class, 'Eloquent' => Illuminate\Database\Eloquent\Model::class, 'Event' => Illuminate\Support\Facades\Event::class, 'File' => Illuminate\Support\Facades\File::class, 'Gate' => Illuminate\Support\Facades\Gate::class, 'Hash' => Illuminate\Support\Facades\Hash::class, 'Lang' => Illuminate\Support\Facades\Lang::class, 'Log' => Illuminate\Support\Facades\Log::class, 'Mail' => Illuminate\Support\Facades\Mail::class, 'Notification' => Illuminate\Support\Facades\Notification::class, 'Password' => Illuminate\Support\Facades\Password::class, 'Queue' => Illuminate\Support\Facades\Queue::class, 'Redirect' => Illuminate\Support\Facades\Redirect::class, 'Redis' => Illuminate\Support\Facades\Redis::class, 'Request' => Illuminate\Support\Facades\Request::class, 'Response' => Illuminate\Support\Facades\Response::class, 'Route' => Illuminate\Support\Facades\Route::class, 'Schema' => Illuminate\Support\Facades\Schema::class, 'Session' => Illuminate\Support\Facades\Session::class, 'Storage' => Illuminate\Support\Facades\Storage::class, 'URL' => Illuminate\Support\Facades\URL::class, 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class ],然后在laravel框架处理请求过程中,会通过Illuminate\Foundation\Bootstrap\RegisterFacades这个类来注册这些别名到全局环境里面:
make('config')->get('app.aliases', []))->register(); } }所以我们才能直接通过别名,代替完整的类型名做同样的访问功能。如果你自己写了一些类,名称很长,并且在代码里面用的特别多,也可以考虑配置到config/app.php别名里面去,l
aravel会帮我们注册。
3)另外一种方式拿到laravel容器实例就是在服务提供者里面直接使用$this->app
服务提供者后面还会介绍,现在只是引入。因为服务提供者类都是由laravel容器实例化的,这些类都继承自Illuminate\Support\ServiceProvider,它定义了一个实例属性$app
laravel在实例化服务提供者的时候,会把laravel容器实例注入到这个$app上面。所以我们在服务提供者里面,始终能通过$this->$app访问到laravel容器实例,而不需要再使用app()函数或者App Facade了。
更多laravel技术文章,请访问laravel教程栏目!
# laravel # 绑定 # 就能 # 能把 # 可执行 # 的是 # 是在 # 却是 # 不需要 # 是由 # 在实际
相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571 】
相关推荐: Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】 iOS发送验证码倒计时应用 Java解压缩zip - 解压缩多个文件或文件夹实例 高性能网站服务器配置指南:安全稳定与高效建站核心方案 Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能 Laravel中的withCount方法怎么高效统计关联模型数量 网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的? 如何在 Pandas 中基于一列条件计算另一列的分组均值 如何快速搭建高效WAP手机网站? 如何挑选最适合建站的高性能VPS主机? 如何在万网自助建站平台快速创建网站? 制作公司内部网站有哪些,内网如何建网站? Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践 Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用 Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践 品牌网站制作公司有哪些,买正品品牌一般去哪个网站买? Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧 如何基于云服务器快速搭建个人网站? 购物网站制作费用多少,开办网上购物网站,需要办理哪些手续? Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲 html5audio标签播放结束怎么触发事件_onended回调方法【教程】 php静态变量怎么调试_php静态变量作用域调试技巧【解答】 Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】 活动邀请函制作网站有哪些,活动邀请函文案? Laravel如何配置任务调度?(Cron Job示例) Laravel如何实现密码重置功能_Laravel密码找回与重置流程 高防服务器如何保障网站安全无虞? 英语简历制作免费网站推荐,如何将简历翻译成英文? 使用C语言编写圣诞表白程序 微信推文制作网站有哪些,怎么做微信推文,急? 微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】 Swift开发中switch语句值绑定模式 如何在IIS7上新建站点并设置安全权限? Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】 如何在腾讯云服务器快速搭建个人网站? 如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】 Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】 Laravel如何使用Telescope进行调试?(安装和使用教程) Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】 INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】 Mybatis 中的insertOrUpdate操作 Laravel怎么解决跨域问题_Laravel配置CORS跨域访问 ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】 javascript基于原型链的继承及call和apply函数用法分析 Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】 公司门户网站制作流程,华为官网怎么做? php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】 最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢? Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】 悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤


aravel会帮我们注册。