【问题标题】:Laravel Service Provider bypassed绕过 Laravel 服务提供者
【发布时间】:2015-10-24 04:49:50
【问题描述】:

我有以下课程:

<?php

namespace App\CustomClasses;

class Disqus {

    protected $secretKey;
    protected $publicKey;

    public function __construct()
    {
        $this->secretKey = 'abc';
        $this->publicKey = '123';
    }

    public function payload()
    {
    ...
    }    

}

我还创建了一个服务提供者(简化如下),将此类绑定到 IOC 容器:

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\CustomClasses\Disqus;

class DisqusServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app->singleton('Disqus', function() {
            return new Disqus();
        });
    }

    public function boot()
    {
        //
    }

}

在我的控制器中:

<?php

use App\CustomClasses\Disqus;

class ArticlesController extends Controller {

    public function view(Disqus $disqus)
    {
    ...
    //$disqus = App::make('Disqus');
    return View::make('articles.view', compact(array('disqus')));
    }
}

问题是每当我使用$disqus 变量时,它都不是从服务提供者“生成”的,而是从 Disqus 类本身。

但是,当我有$disqus = App::make('Disqus'); 时,变量会通过服务提供者。

所以我的问题是,由于绑定存在于服务提供者中,$disqus 变量不应该直接来自 DisqusServiceProvider 而不是 Disqus 类我在控制器中使用它?

我错过了什么吗?

提前感谢您的帮助。

【问题讨论】:

    标签: php dependency-injection laravel-5 ioc-container service-provider


    【解决方案1】:

    当控制器的动作需要传递 App\CustomClasses\Disqus 类的对象时,服务容器会在其映射中搜索依赖项的类名,以查看它是否具有相应的服务。但是,它使用完全限定的类名,这就是它在您的情况下无法正常工作的原因。

    在您的服务提供商中,您已将服务绑定到 Disqus,而完全限定的类名是 App\CustomClasses\Disqus。在提供程序中使用完全限定的类名,它应该可以工作。

    【讨论】:

    • 这是正确的并解决了问题。但是,即使这是正常行为,在文档中提及也会有所帮助:在提供程序中应使用完全限定的类名,而不仅仅是类名(即使使用 use 关键字)。
    猜你喜欢
    • 1970-01-01
    • 2016-12-21
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2019-05-29
    • 2014-04-20
    • 2015-12-21
    相关资源
    最近更新 更多