我正在使用Laravel 5.4,我在resources/views/layouts/app.blade.php
中有这个app.blade.php:
<div>
@include('assets.select', ['name'=>'current_company', datas=>$companys, 'required' => true, 'selected' => 1])
</div>
这里我需要在html选择字段中显示用户的公司列表。我创建了一个名为SetViewVariables的middleware
,并注册到Kernel.php
数组中的$middleware
,如下所示:
\App\Http\Middleware\SetViewVariables::class,
这是SetViewVariables.php:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Contracts\Auth\Guard;
use DB;
class SetViewVariables
{
protected $auth;
public function __construct(Guard $auth)
{
$this->auth = $auth;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$userdata = Auth::user();
$company = DB::table('company_users')
->join('company','company_users.company_id','=','company.id')
->select('company.id AS value','company.name AS name')
->where('company_users.user_id','=',$userdata->id)
->orderBy('company.name')
->get();
view()->share('companys', $company);
return $next($request);
}
}
$userdata
始终为空,因此$userdata->id
也未定义。
此时如何获取已登录用户的ID?或者有更好的方法将$ company数据推送到app.blade.php?
答案 0 :(得分:0)
我建议你使用ViewComposer来显示特定刀片视图中的数据,而不是(ab)使用中间件。
另一个解决方案是在控制器中传递变量,但ViewComposer可以说是这种情况的最佳解决方案。
这将是ViewComposer的撰写功能部分。
....
public function compose(View $view)
{
$view->with('userdata', Auth::users()->id);
}
}
答案 1 :(得分:0)
在中间件中,Auth :: user()只有在以下情况下才能返回空:
1)用户未登录
2)您的中间件尝试在错误的时间访问用户数据,例如当会话不存在时。
由于您的中间件位于$middleware
数组中,$middlewareGroups
尚未运行,并且在运行时,会话不存在。
解决方案:
1)将中间件从$ middleware移动到$ middlewareGroups数组的末尾
或
2)将会话处理程序中间件从$ middlewareGroups移动到$ middleware(在中间件之前)。