Laravel 工程项目的关键概念: ServiceProvider
ServiceProvider 是 Laravel 框架的基本结构之一,也是它的概要文件。初始化系统的主要步骤是初始化ServiceProvider。 ServiceProvider主要用于组件的初始化类。注入和实例化。
查看vendor/laravel/framework/src/Illuminate下的源代码,你会发现每个组件都有一个 xxServiceProvider 类。
示例:verndor/laravel/framework/src/Illuminate/Log/LogServiceProvider.php
class LogServiceProvider 扩展 ServiceProvider
{
/** *
* @return void
*/
public function register()
{
$this->app->singleton('log', function ($app) {
return new LogManager($app);
});
}
}
这里的log方法完成了日志和LogManager的绑定,也就是说,我们对日志的操作实际上是在LogManager中操作。我们在程序中使用时:
//这只是一个例子,不建议这样使用
app('log') -> info(this is 'test msg', [] );
以上记录完毕。
原理
Laravel 在框架的 Bootstrap 阶段传递 src/Illuminate/Foundation/Bootstrap/RegisterProvider.php 和 BootProviders.php。两个类完成ServiceProvider的注册和初始化:
public function registerConfiguredProviders()
{
$providers = Collection ::make($this->make('config')->get('app.providers'))
->partition(function ($provider) {
return strpos($providers) , '解释\\') === 0;
});
$providers->splice(1, 0, [$this->make(PackageManifest::class)->providers()]) ;
(new ProviderRepository ($this, new Filesystem, $this->getCachedServicesPath()))
->load($providers->collapse()->toArray());
}
public function boot()
{
if ($this->isBooted()) {
return;
}
//应用程序运行完毕后,还会启动一些“ booted" " 回调
// 用于在初始启动后需要执行工作的侦听器
// 完成。这在订购我们的启动过程时非常有用。
$ this->fireAppCallbacks($ this- >bootingCallbacks);
array_walk ($this->serviceProviders, function ($p) {
$this->bootProvider($p);
});
$this->booted = true ;
$this->fireAppCallbacks($this->bootedCallbacks);
}
系统会查找config/app.php中注册的ServiceProvider,并执行register()和boot()方法。对于上面的LogServiceProvider来说,就完成了LogManager和日志的绑定。为了便于说明,您可以查看 QueueServiceProvider.php RedisServiceProvider.php 完成的工作。
自定义ServiceProvider
Laravel 的 ServiceProvider 包含在 app/config/app.php 中,如果不需要可以删除。
示例:现在我们需要一个函数来检查 .env 文件是否存在。这可以通过配置 EnvCheckServiceProvider 来完成,因为此任务需要在处理框架请求之前完成。
新 ServiceProvider
php artisan do:provider EnvCheckServiceProvider
类 EnvCheckServiceProvider 扩展 ServiceProvider
{
/** *. *. * @return void
* /
public function register()
{
if (!file_exists(base_path('.env'))) {
throw \Exception(".env 缺少文件。添加此文件。") ;
}
}
/**
* 引导服务。
*
* @return void
*/ 公共函数 ()
{
//
}
}
添加EnvCheckServiceProvider.php
'providers' => [
//其他appxx.php config.php \App\Providers\EnvCheckServiceProvider::class,
]
我们检查删除文件夹中的.env,进入之前的界面,会看到错误
ServiceProvider使用场景当任务需要时在处理请求之前要完成的工作,比如设置类、查找请求环境、创建文件等,都可以使用ServiceProvider来完成。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。