Laravel依赖注入Auth ::

时间:2017-03-01 15:44:24

标签: php laravel dependency-injection

我有一个带有CalendarService的laravel项目,我将该服务注入到我的控制器中。在构造中我做了这样的事情:

CalendarService.php

/** @var Collection|Timelog[] */
private $timelogs;

public function __construct()
{
    $this->currentRoute = URL::to( '/' ) . "/home";
    $this->timelogs     = Auth::user()->timelogs()->get();
    $this->currentDay   = 0;
}

HomeController.php

/** @var CalendarService */
protected $calenderService;

public function __construct
(
    CalendarService $calendarService
)
{
    $this->calenderService = $calendarService;
}

我收到此错误

  

在null

上调用成员函数timelogs()

关于这行代码:

Auth::user()->timelogs()->get();

我在我的服务中使用了use Illuminate\Support\Facades\Auth;

这里发生了什么?

2 个答案:

答案 0 :(得分:1)

问题是(如https://laracasts.com/discuss/channels/laravel/cant-call-authuser-on-controllers-constructor所指出的)Auth中间件在控制器构建阶段未初始化的事实。

你可以这样做:

protected $calenderService;

public function __construct()
{ 
    $this->middleware(function ($request,$next) {        
         $this->calenderService = resolve(CalendarService::class);
         return $next($request);
     });
}

替代

public function controllerMethod(CalendarService $calendarService) { 
    //Use calendar service normally
}

注意:这假设您可以通过服务容器解析CalendarService

答案 1 :(得分:0)

您无法在最新版本的Laravel中的构造函数中使用auth()Auth::,因此您需要在方法中直接使用此逻辑。

public function someMethod()
{
    $timelogs = Auth::user()->timelogs()->get();