我想在boot
类的AppServiceProvider
函数中传递用户ID(因为它写为in the docs),但是由于某种原因,Auth::user()
对象为空。
myAppName / app / Providers / 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
如何使其工作?
答案 0 :(得分:1)
Laravel刀片服务器可以访问当前经过身份验证的用户,您不必为此明确使用view :: share。
您只需按以下方式访问刀片中的身份验证用户即可:
{{ Auth::user()->id }}
您可能会检查用户是否已经通过@guest
帮助程序或auth检查方法进行了身份验证:
@if (Auth::check())
// authenticated
{{ Auth::user()->id }}
@else
// Not authenticaed
@endif
答案 1 :(得分:0)
出于安全原因,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数组中删除这两行。祝你好运!
答案 2 :(得分:0)
这是一个解决方案,只需将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>
说明here