深入解析Laravel5.5中的包自动发现Package Auto Disco
当Laravel 5.5的浪潮即将到来之际,一项令人兴奋的新特性——包自动发现(Package Auto Discovery)即将问世。不再需要手动配置服务提供者和Facades的注册信息,Laravel 5.5将会自动检测和注册它们。本文将深入这一新特性的源头和运作机制,并特别关注其背后的源代码实现。
让我们回顾一下`composer.json`文件。这是包自动发现的起点。在使用Composer时,你可以在`post-autoload-dump`部分指定一些脚本。在Laravel 5.5中,我们可以看到这样的定义:
```json
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover"
]
}
```
当我们执行Composer的自动加载文件生成脚本时,会触发`postAutoloadDump`事件。其中,我们关注的是`@php artisan package:discover`命令。这个命令位于`Illuminate\Foundation\Console\PackageDiscoverCommand`中,它通过执行`Illuminate\Foundation\PackageManifest`的`build()`方法来实现包发现的使命。
PackageManifest已经被注册在Laravel的容器中,这意味着每次启动Laravel时都可以使用它的`build()`方法。这个方法的主要逻辑是寻找`vendor/poser/installed.json`文件。这个文件由Composer生成,记录了每次的Composer自动加载类映射信息。Laravel会将这些内容映射到`extra.laravel`的部分。例如:
```json
"extra": {
"laravel": {
"providers": [
"Barryvdh\\Debugbar\\ServiceProvider"
],
"aliases": {
"Debugbar": "Barryvdh\\Debugbar\\Facade"
}
}
}
```
Laravel直接读取这些信息到一个集合中,然后检查是否存在特定的定义来决定是否需要执行包发现动作。如果你不希望执行包发现的动作,可以在`extra.laravel`中添加一个名为`dont-discover`的数组来指定不希望被发现的包,例如:
```json
"extra": {
"laravel": {
"dont-discover": [
"barryvdh/laravel-debugbar"
]
}
}
```这样,你就不需要手动注册服务提供者或创建别名了。包自动发现功能将为你自动完成这些繁琐的工作,极大地简化了Laravel的开发体验。通过深入理解这一新特性的工作原理和背后的源代码实现,我们可以更好地利用它来提高开发效率和便利性。 Laravel 5.5 的包自动发现功能
在完成判断流程后,Laravel 会将 collection 中所需的包信息保存到一个特定的缓存文件 bootstrap/cache/packages.php 中。此文件结构清晰,易于理解,如以下示例所示:
```php
return array (
'barryvdh/laravel-debugbar' => array (
'providers' => array (
0 => 'Barryvdh\Debugbar\ServiceProvider',
),
'aliases' => array (
'Debugbar' => 'Barryvdh\Debugbar\Facade',
),
),
);
```
那么,Laravel 如何获取这些包信息呢?这涉及到 Laravel 项目启动时的主要服务,特别是与网站 SEO 优化相关的两个服务:RegisterFacades 和 RegisterProvider。当项目启动时,RegisterFacades 服务会使用 Illuminate\Foundation\AliasLoader 来加载所有的 alias。在 AliasLoader 中,有一个关键的步骤就是合并并注册所有的 alias。让我们来看一下具体的代码:
```php
// in RegisterFacades::bootstrap()
AliasLoader::getInstance(array_merge(
$app->make('config')->get('app.aliases', []), // 从 app.php 获取的 aliases 数组
$app->make(PackageManifest::class)->aliases() // 从 bootstrap/cache/packages.php 获取的包信息中的 aliases 数组
))->register(); // 注册所有的 alias,这样我们就可以使用包提供的所有功能了。你还可以在 app.php 中定义你自己的 alias 来覆盖自动发现的包,保证项目的流畅运行。
```
这个过程确保了 Laravel 可以自动发现并加载所有的包,这对于开发者和开发者社区来说是非常方便的。开发者可以快速地安装和使用新的 Laravel 包,而无需手动配置或注册。这种自动发现机制大大简化了 Laravel 的包管理,提高了开发效率和便捷性。开发者仍然可以在 app.php 中自定义他们的 alias,以覆盖自动发现的包设置,保证项目的灵活性。通过这种方式,Laravel 保持了强大的扩展性和灵活性,使得开发者能够轻松地构建和扩展他们的应用程序。本文梳理了 Laravel 5.5 包自动发现的原理和源码,希望对你有所帮助。如果你有任何疑问或需要进一步的讨论,请随时交流。感谢你对狼蚁SEO的支持和关注。
编程语言
- 深入解析Laravel5.5中的包自动发现Package Auto Disco
- 前端js实现文件的断点续传 后端PHP文件接收
- jQuery EasyUI 选项卡面板tabs的使用实例讲解
- Laravel ORM对Model--find方法进行缓存示例详解
- 如何通过Linux命令行使用和运行PHP脚本
- php求斐波那契数的两种实现方式【递归与递推】
- linux下mysql5.7.17最新稳定版本安装教程
- 详解AngularJS控制器的使用
- 浅谈PHP正则中的捕获组与非捕获组
- SQL Server 2016 CTP2.3 的关键特性总结
- PHP使用xpath解析XML的方法详解
- Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
- js实现抽奖效果
- 关于Win10下MySQL5.7.17免安装版基本配置教程(图文详
- sqlserver 模糊查询常用方法
- PHP CodeIgniter分页实例及多条件查询解决方案(推荐