我在Laravel5中创建了一个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;
});
}
}
我刚刚开始,所以创建的两个具体类只是空类声明:
namespace App\Services\Passwords;
class FileMakerTokenRepository {
}
namespace App\Services\Passwords;
class FileMakerPasswordBroker {
}
我已在config/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绑定和解析的文档,看起来一切都是正确的,但我显然遗漏了一些东西。
我是否缺少一个步骤或者我缺少的东西:从服务容器中解析一个单身?
如果有帮助,这里是一个堆栈的屏幕截图:
另一个有趣的事实:当我从开发控制器将应用程序转储到浏览器时:
dd($this->app);
查看服务提供商列表,FileMakerPasswordResetServiceProvider
类不存在:
提供者最终将被推迟,但目前我已将deferred属性注释掉,因此(据我所知)它应该被加载。我看到我在堆栈中注册的其他提供商。这可能是另一条线索。