如何在 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 被重新创建。