Laravel 绕过服务提供商
Laravel Service Provider bypassed
我有以下 Class:
<?php
namespace App\CustomClasses;
class Disqus {
protected $secretKey;
protected $publicKey;
public function __construct()
{
$this->secretKey = 'abc';
$this->publicKey = '123';
}
public function payload()
{
...
}
}
我还创建了一个服务提供者(在下面进行了简化),以将此 class 绑定到 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
变量时,它不是来自服务提供商的 'generated',而是 Disqus class 本身。
但是,当我有 $disqus = App::make('Disqus');
时,变量会通过服务提供商。
所以我的问题是,既然服务提供商中存在绑定,那么 $disqus
变量不应该来自 DisqusServiceProvider 而不是 Disqus class 当我在我的控制器中直接使用它时?
我是不是漏掉了什么?
在此先感谢您的帮助。
当控制器的操作需要传递 classApp\CustomClasses\Disqus 的对象时,服务容器会在其映射中搜索 class依赖名称,看是否有对应的服务。但是,它使用完全限定的 class 名称,这就是它在您的情况下无法正常工作的原因。
在您的服务提供商中,您已将服务绑定到 Disqus,而完全限定的 class 名称是 App\CustomClasses\Disqus。在提供程序中使用完全限定的 class 名称,它应该可以工作。
我有以下 Class:
<?php
namespace App\CustomClasses;
class Disqus {
protected $secretKey;
protected $publicKey;
public function __construct()
{
$this->secretKey = 'abc';
$this->publicKey = '123';
}
public function payload()
{
...
}
}
我还创建了一个服务提供者(在下面进行了简化),以将此 class 绑定到 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
变量时,它不是来自服务提供商的 'generated',而是 Disqus class 本身。
但是,当我有 $disqus = App::make('Disqus');
时,变量会通过服务提供商。
所以我的问题是,既然服务提供商中存在绑定,那么 $disqus
变量不应该来自 DisqusServiceProvider 而不是 Disqus class 当我在我的控制器中直接使用它时?
我是不是漏掉了什么?
在此先感谢您的帮助。
当控制器的操作需要传递 classApp\CustomClasses\Disqus 的对象时,服务容器会在其映射中搜索 class依赖名称,看是否有对应的服务。但是,它使用完全限定的 class 名称,这就是它在您的情况下无法正常工作的原因。
在您的服务提供商中,您已将服务绑定到 Disqus,而完全限定的 class 名称是 App\CustomClasses\Disqus。在提供程序中使用完全限定的 class 名称,它应该可以工作。