如何将经过身份验证的用户绑定到控制器中的参数?

时间:2019-05-12 17:09:45

标签: php laravel

我无法在控制器中检索经过身份验证的网站管理员。如下所示,我通过$this->middleware在构造函数中对用户进行身份验证:

class DomainController 
.....
 public function __construct()
    {
        $this->middleware('auth:webmasters');
    }
    public function requestNewName(Request $request, Webmaster $webmaster, DomainRepositoryInterface $domainRepository): array
    {
        // $webmaster->id === null here
        /** @var Webmaster $webmaster */
        $webmaster = Auth::user(); // $webmaster->id === 1, all OK
        $domainRepository->requestChangeName($webmaster, $request->input('newName', ''));
        return ['result' => true];
    }
....

我认为我需要将其绑定到某个地方,但是我不知道在哪里或如何?

P。

现在我在AuthServiceProvider中:

    foreach ([Webmaster::class, Admin::class] as $class) {
        $this->app->bind($class, static function($app) use ($class) {
            $authenticated = Auth::user();
            /** @noinspection GetClassUsageInspection */
            return $authenticated && get_class($authenticated) === $class ? $authenticated : null;
        });
    }
}

然后在启动方法中调用此函数。我敢打赌,laravel可以满足要求。

2 个答案:

答案 0 :(得分:0)

您希望通过laravel的依赖项注入将网站管理员注入到您的方法中。

执行此操作的方法是通过服务容器,该服务容器负责处理注射。当您使用Webmaster $ webmaster时,它会查找具有该类型的绑定,因为您尚未执行显式绑定,因此无论如何它都会尝试为您提供一个实例,但这只是一个通用实例。

您要做的就是在您的服务提供商中添加以下代码:

$this->app->bind('App\Webmaster', function ($app) {
   return Auth::user();
});

现在laravel知道您希望如何将网站站长注入该功能。

答案 1 :(得分:0)

这应该是一条评论,但我的声誉不足。您的代码对我来说还不错。但我想到一件事。

由于$webmaster->id为您提供了空值,因此意味着Webmaster类已正确导入到DomainController中。但是,也许您没有正确地将Webmaster类导入到AuthServiceProvider中。也可能dd(get_class($webmaster));会有所帮助。无论如何,Auth::user()会在您的应用程序中返回什么?