如何在 laravel 5 中启动服务提供商
How to boot a service provider in laravel 5
我正在 Laravel 5 迈出我的第一步,特别是包开发。我使用此软件包的目的是始终在每个请求中启动。
所以,我开始创建服务 HelloWorldServiceProvider:
<?php
namespace FacebookKiller\Modules\HelloWorld;
use Illuminate\Support\ServiceProvider;
class HelloWorldServiceProvider extends ServiceProvider{
protected $defer = false;
public function boot(){
dd('hello world at boot()')
}
public function register()
{
dd('hello world at register()')
}
}
其实这个文件就是从root开始的这个路径:
/Larave/app/Modules/HelloWorld/HelloWorldServiceProvider.php
然后,我编辑 config/app.php
文件以添加服务提供商
'Illuminate\Translation\TranslationServiceProvider',
'Illuminate\Validation\ValidationServiceProvider',
// my module
'FacebookKiller\Modules\HelloWorld\HelloWorldServiceProvider'
最后,为了测试 dd()
是否被调用,我编辑了 routes.php
文件,如:
Route::get('test', function(){
return "Making a test request";
});
结果是否定的。未加载服务提供者。根据文档:
Deferring the loading of such a provider will improve the performance
of your application, since it is not loaded from the filesystem on
every request.
To defer the loading of a provider, set the defer property to true
因此,我将 protected $defer
设置为 false
相反。但是 dd()
函数没有被触发。
使用服务提供商类型很重要,因为这样我就可以从中加载语言、视图和配置文件。
删除 storage/framework/services.json
个文件。
Laravel 在此文件中缓存所有服务提供商数据。
调试服务提供商时始终查看此文件。
这是关于服务提供商和 services.json 文件的非常有用的答案
How does Laravel 4 load deferred provider?
./artisan clear-compiled
也可以解决问题。
找到这个解决方案后,我认为必须有一个 artisan
命令。宾果游戏,已经有了。看一下它的代码,我看到除了清除已编译的 类 文件外,它还清除了 services.json
.
public function fire()
{
if (file_exists($path = $this->laravel->storagePath().'/framework/compiled.php'))
{
@unlink($path);
}
if (file_exists($path = $this->laravel->storagePath().'/framework/services.json'))
{
@unlink($path);
}
}
在应用程序的下一次引导中 services.json
被重新创建。
我正在 Laravel 5 迈出我的第一步,特别是包开发。我使用此软件包的目的是始终在每个请求中启动。
所以,我开始创建服务 HelloWorldServiceProvider:
<?php
namespace FacebookKiller\Modules\HelloWorld;
use Illuminate\Support\ServiceProvider;
class HelloWorldServiceProvider extends ServiceProvider{
protected $defer = false;
public function boot(){
dd('hello world at boot()')
}
public function register()
{
dd('hello world at register()')
}
}
其实这个文件就是从root开始的这个路径:
/Larave/app/Modules/HelloWorld/HelloWorldServiceProvider.php
然后,我编辑 config/app.php
文件以添加服务提供商
'Illuminate\Translation\TranslationServiceProvider',
'Illuminate\Validation\ValidationServiceProvider',
// my module
'FacebookKiller\Modules\HelloWorld\HelloWorldServiceProvider'
最后,为了测试 dd()
是否被调用,我编辑了 routes.php
文件,如:
Route::get('test', function(){
return "Making a test request";
});
结果是否定的。未加载服务提供者。根据文档:
Deferring the loading of such a provider will improve the performance of your application, since it is not loaded from the filesystem on every request. To defer the loading of a provider, set the defer property to true
因此,我将 protected $defer
设置为 false
相反。但是 dd()
函数没有被触发。
使用服务提供商类型很重要,因为这样我就可以从中加载语言、视图和配置文件。
删除 storage/framework/services.json
个文件。
Laravel 在此文件中缓存所有服务提供商数据。 调试服务提供商时始终查看此文件。
这是关于服务提供商和 services.json 文件的非常有用的答案
How does Laravel 4 load deferred provider?
./artisan clear-compiled
也可以解决问题。
找到这个解决方案后,我认为必须有一个 artisan
命令。宾果游戏,已经有了。看一下它的代码,我看到除了清除已编译的 类 文件外,它还清除了 services.json
.
public function fire()
{
if (file_exists($path = $this->laravel->storagePath().'/framework/compiled.php'))
{
@unlink($path);
}
if (file_exists($path = $this->laravel->storagePath().'/framework/services.json'))
{
@unlink($path);
}
}
在应用程序的下一次引导中 services.json
被重新创建。