无法从服务容器中解析单例

时间:2015-08-12 19:45:50

标签: php reflection singleton laravel-5

我在Laravel5中创建了一个ServiceProvider,它将两个单例注册到服务容器中:

的ServiceProvider

namespace App\Providers;

use App\Services\Passwords\FileMakerPasswordBroker;
use App\Services\Passwords\FileMakerTokenRepository;
use Illuminate\Support\ServiceProvider;

class FileMakerPasswordResetServiceProvider extends ServiceProvider
{

    protected $defer = true;

    public function provides(){
        return ['fm.password','fm.password.token'];
    }

    public function register()
    {
        $this->registerPasswordBroker();
        $this->registerTokenRepository();
    }

    protected function registerPasswordBroker(){
        $this->app->singleton('fm.password', function ($app){
            return new FileMakerPasswordBroker;
        });
    }

    protected function registerTokenRepository(){
        $this->app->singleton('fm.password.token', function ($app){
            return new FileMakerTokenRepository;
        });
    }
}

我刚刚开始,所以创建的两个具体类只是空类声明:

TokenRepository

namespace App\Services\Passwords;

class FileMakerTokenRepository {

}

PasswordBroker

namespace App\Services\Passwords;

class FileMakerPasswordBroker {

}

我已在config/app.php课程中注册了我的服务提供商:

app.php

...

   'providers' => [

        ...
        App\Providers\FileMakerPasswordResetServiceProvider::class

...

问题是,我无法解决服务容器中的单例:

开发控制器

...

use Illuminate\Foundation\Application;

class DevController extends Controller
{

    protected $app;

    public function __construct(Application $app){
        $this->app = $app;
    }

    public function testPasswordReset(){
        // This throws an error
        return $this->app->make('fm.password.token');
    }

    ...

当我尝试制作单身时,我收到错误

  

Container.php第736行中的ReflectionException:   类fm.password.token不存在

我回过头来看the service container绑定和解析的文档,看起来一切都是正确的,但我显然遗漏了一些东西。

我是否缺少一个步骤或者我缺少的东西:从服务容器中解析一个单身?

更新

如果有帮助,这里是一个堆栈的屏幕截图:

Error Stack

另一个有趣的事实:当我从开发控制器将应用程序转储到浏览器时:

dd($this->app);

查看服务提供商列表,FileMakerPasswordResetServiceProvider类不存在:

Missing service provider when dumping app

提供者最终将被推迟,但目前我已将deferred属性注释掉,因此(据我所知)它应该被加载。我看到我在堆栈中注册的其他提供商。这可能是另一条线索。

0 个答案:

没有答案