Я хочу передать идентификатор пользователя в функции boot класса AppServiceProvider (как написано в документах), но по какой-то причине объект 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.
Как заставить работать?






Laravel blade имеет доступ к текущему аутентифицированному пользователю, вам не нужно явно использовать view :: share для этого.
Вы можете просто получить доступ к пользователю авторизации в блейде как:
{{ Auth::user()->id }}
Вы можете проверить, аутентифицирован ли пользователь уже с помощью помощника @guest или метода проверки подлинности:
@if (Auth::check())
// authenticated
{{ Auth::user()->id }}
@else
// Not authenticaed
@endif
Спасибо! Хорошо, но что, если я хочу получить некоторые данные, например, из таблицы user_gruops, которая связана с таблицей users с помощью id? Думаю, было бы удобно разместить все данные о пользователях в одном месте и назначить конкретную переменную, а затем использовать ее в шаблонах.
по соображениям безопасности Laravel ServiceProvider не имеет доступа к сеансу. И после входа в систему laravel поддерживает текущего пользователя в сеансе. Вот почему вы получаете эту ошибку.
Для вашей проблемы вы можете поделиться переменной в конструкторе класса 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();
}
}
Еще одна вещь, сессия по умолчанию, также не может быть передана в конструктор. Вы должны включить его, добавив эти две строки в массив $ middleware класса App / Http / Kernel.php.
class Kernel extends HttpKernel
{
protected $middleware = [
//
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
//
];
}
Убедитесь, что вы удаляете эти две строки из массива $ middlewareGroups. Удачи !!!
Спасибо за ваш ответ. По соображениям безопасности в документации нет объяснения, как делиться данными аутентификации (шучу). На самом деле это не решение, потому что для этого требуется конструктор выполнения родительского класса в каждом контроллере, где используется эта общая переменная. Похоже, еще один костыль. После некоторых поисков я понял, что эта проблема в Laravel - своего рода боль. Какая жалость. Я начал искать какой-нибудь другой фреймворк.
Это решение, просто нужно добавить 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>
Пояснение здесь
Кроме того, на слое
auth()->user()отсутствуетServiceProvider. См. Жизненный цикл laravel: laravel.com/docs/5.6/lifecycle