【问题标题】:Service Container issue服务容器问题
【发布时间】:2018-10-26 13:48:17
【问题描述】:

我观看了一个 laravel 视频课程,其中在 web.php 中演示了服务容器的使用(仅作为示例),在 web.php 中它可以正常工作:

interface KekInterface {};
class Kek implements KekInterface {};
app()->bind('KekInterface', function() { 
    return new Kek;    
});
Route::get('/', function(KekInterface $kekat) {
    dd($kekat);
});

我决定将我所有的代码移动到一个控制器(控制器类):

public function index(KekInterface $api)
{
    dd($api);
}

接口和类:

interface KekInterface {};
class Kek implements KekInterface {};
app()->bind('KekInterface', function() { 
    return new Kek;    
});

然后 laravel 叫了一声:

目标 [App\Http\Controllers\KekInterface] 不可实例化。

我不知道是什么导致了问题,但我猜这只是命名空间

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    这是因为绑定必须在 service provider 内运行。

    app()->bind(...)部分代码放在App\Providers\AppServiceProvider类的register方法中:

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        app()->bind(\Full\Namespace\To\KekInterface::class, function() {
            return new \Full\Namespace\To\Kek();
        })
    }
    

    请注意,KekInterfaceKek 必须位于不同的文件中,以类名命名,并根据您想要的命名空间位于正确的文件夹中。

    请参阅Laravel Service Container docs 以更好地理解。

    【讨论】:

    • 它工作了,虽然它在 web.php 中也能工作对我来说似乎很奇怪?顺便说一句,谈论服务提供者,如果我将第一个参数(类名)传递给绑定(单例等)方法,但传递另一个类作为第二个参数,例如:$this->app->bind('App\Billing\Stripe', function(){return new Kek}) laravel 会抛出一个错误,我觉得这有点奇怪。因为正如我之前想的那样,该方法将类注册到容器中,但想出它只是编辑已自动解析的现有类。真的是这样吗?
    • 它适用于 web.php,因为路由是在 ServiceProvider (RouteServiceProvider) 内部调用的。 :-)
    • 绑定呢?
    • 如果它适用于接口,为什么它不适用于类?但我想这是一个新问题的主题:)
    • 不确定。 :-(
    猜你喜欢
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2015-05-16
    • 2014-07-22
    • 2016-12-12
    • 2016-12-30
    相关资源
    最近更新 更多