繁体   English   中英

Laravel 5.6共享身份验证ID问题

[英]Laravel 5.6 share auth id issue

我想在AppServiceProvider类的boot功能中传递用户ID(如docs中所写),但由于某种原因Auth::user()对象为空。

myAppName /应用程序/提供者/ AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\URL;

use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\Auth;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191);
        URL::forceScheme('https');
        View::share('user_info', Auth::user());
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

然后在一些刀片模板中:

<p>{{ $user_info->id }}</p>

结果发生错误:

Trying to get property 'id' of non-object

如果要通过Auth::user()->id也会出现相同的错误

如何使其运作?

Laravel刀片服务器可以访问当前经过身份验证的用户,因此您不必显式使用view :: share。

您可以简单地通过以下方式访问刀片服务器中的auth用户:

{{ Auth::user()->id }}

您可以通过@guest helper或auth check方法检查用户是否已通过身份验证:

@if (Auth::check())
  // authenticated
  {{ Auth::user()->id }}
@else
  // Not authenticaed
@endif

出于安全原因,Laravel ServiceProvider无权访问会话。 登录后laravel保持当前登录用户进入Session。 这就是为什么您会收到此错误。

对于您的问题,您可以将变量共享到Controller(App / Http / Controllers / Controller.php)类的构造函数中。

像这样:

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    public function __construct()
    {
        view()->share('user',auth()->user());
    }
}

Laravel中的所有控制器默认都扩展了此类。 然后,您只需要执行父类的构造函数,如下所示:

class HomeController extends Controller
{
    public function __construct()
    {
        parent::__construct();
    }
}

默认会话也不能再共享到Constructor中。 您必须通过将这两行添加到App / Http / Kernel.php类的$ middleware数组中来启用它。

class Kernel extends HttpKernel
{
    protected $middleware = [
       //
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
       //
    ];
}

确保从$ middlewareGroups数组中删除了这两行。 祝好运 !!!

这是一个解决方案,只需将View Composer添加到AppServiceProvider

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\URL;

use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\Auth;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        view()->composer('layouts.navbar', function($view) {

           $view->with('user_id', Auth::user()->id);

        });
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

然后只需将一个变量放在navbar模板中,如下所示: <p>{{ $user_id }}</p>

此处说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM