簡體   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