环境
Laravel 5.4
前言
最近在学习Laravel框架,想创建一个Service Provider(服务器提供者)练练手,但创建完之后,无论如何都无法通过make方法获取到服务对象,页面会报Class 'xxx' does not exist
的错误,如下图:
代码
服务提供者:
namespace App\Providers;
use App\Helpers\MusicPlayer;
use Illuminate\Support\ServiceProvider;
class MusicPlayerServiceProvider extends ServiceProvider
{
protected $defer = true; // 延迟加载
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->singleton('player', function() {
return new MusicPlayer();
});
}
}
配置文件:
'providers' => [
/*
* 省略的其它服务器提供者...
*/
App\Providers\MusicPlayerServiceProvider::class,
],
在Controller中获取服务对象:
namespace App\Http\Controllers;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\App;
class Controller extends BaseController
{
public function test()
{
App::make('player'); // 通过make方法获取服务对象
}
}
解决过程
后面查看官方文档,才发现原来是服务提供者少写了一个方法。我的服务提供者是延迟加载的($defer = true
),在延迟加载时,必须再定义一个provides
方法,如下:
namespace App\Providers;
use App\Helpers\MusicPlayer;
use Illuminate\Support\ServiceProvider;
class MusicPlayerServiceProvider extends ServiceProvider
{
protected $defer = true; // 延迟加载
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->singleton('player', function() {
return new MusicPlayer();
});
}
/**
* 延迟加载时必须定义此方法
* @return string[]
*/
public function provides()
{
return ['player'];
}
}
由于Laravel框架会把服务提供者的配置缓存起来,在修改完服务提供者的代码后,需要清除一下缓存,直接删除bootstrap/cache/services.php
文件,或者使用清除命令删除都可以,清除命令:
php artisan clear-compiled
然后重新访问页面,已经没报错了,至此问题得到解决。