Laravel报错:Class ‘xxx‘ does not exist

环境

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

然后重新访问页面,已经没报错了,至此问题得到解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值