[英]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.