Laravel 5.6共享身份验证ID问题

时间:2018-07-31 03:05:39

标签: php laravel-5

我想在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

,则会出现相同的错误

如何使其工作?

3 个答案:

答案 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