如何根据经过身份验证的用户ID在Laravel app.blade.php中显示数据

时间:2017-03-19 22:25:48

标签: php laravel-5.4

我正在使用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?

2 个答案:

答案 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(在中间件之前)。