Использование Auth:User() в представлении Laravel 5.2 для навигации

У меня есть индексный маршрут «/», который загружает index.blade.php, который расширяет мастер. Я не могу использовать Auth::User() на панели навигации, которая частично включена в мастер. Он работает на страницах, требующих аутентификации. У меня есть кнопки входа и регистрации, которые связывают AuthController через /login и /register, и я хотел бы, чтобы они были заменены на Logout, когда аутентифицированный пользователь просматривает индексную страницу «/» или любую другую страницу, где аутентификация не требуется.

Когда пользователь входит в систему, он перенаправляется на маршрут /dashboard, который работает правильно, и панель навигации отображается правильно, но когда они переходят на домашнюю страницу, кнопки входа и регистрации находятся в навигации, и нажатие на них просто перенаправляет их обратно к индексному маршруту "/", не показывая форму входа или регистрации. (поскольку я предполагаю, что они уже вошли в систему.) Единственный способ снова получить форму - вручную ввести / logout в адресной строке.

Я пытаюсь найти ответы повсюду, но не могу понять.

dd(\Auth::user()) возвращает null в контроллере. Я видел много подобных вопросов, но связанных со старыми версиями Laravel, но решения, похоже, не работают, или я просто неправильно их применяю.

Спасибо за помощь!

маршрут.php

Route::get('/','PagesController@index');
Route::group(['middleware' => ['web']], function () {
        //    
        Route::controllers([
         'register' => 'Auth\AuthController',
         'password' => 'Auth\PasswordController',
        ]);
});

PagesController.php

class PagesController extends Controller
{
    //

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        //

    }

    public function index()
    {

        $nav_active = 'home';

        return view('pages.index',compact('nav_active'));

app.blade.php

<ul class="nav navbar-nav navbar-right">
      @if (Auth::guest())
        <li><a href="{{ url('/login') }}">Login</a></li>
        <li><a href="{{ url('/register') }}">Register</a></li>
      @else
        <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
             {{ Auth::user()->name }} <span class="caret"></span>
            </a>
            <ul class="dropdown-menu" role="menu">
                <li><a href="{{ url('/logout') }}"><i class="fa fa-btn fa-sign-out"></i>Logout</a></li>
            </ul>
        </li>
     @endif
</ul>

страница/index.blade.app

@extends('layouts.app')

@section('content')
<div class="container">
    ...
    </div>
</div>
@stop

person Steve Hernandez    schedule 19.01.2016    source источник


Ответы (3)


Поместите все внутрь промежуточного программного обеспечения web. Промежуточное ПО web состоит из других промежуточных программ, которые обрабатывают ваши сеансы. Нет сеанса = нет пользователя.

Например, один из них называется Illuminate\Session\Middleware\StartSession, который отвечает за запуск вашего сеанса.

Я не знаю, почему вы решили поместить именно этот маршрут вне группы web, но без него у вас не будет пользователя. Вы должны помещать маршруты вне группы только в том случае, если вы планируете делать другие вещи, например, создавать API.

person Thomas Kim    schedule 19.01.2016
comment
Это от неопытности с Laravel. Я не использую его очень долго. По какой-то причине я думал, что когда маршруты находятся в группе промежуточного программного обеспечения web, требуется аутентификация. - person Steve Hernandez; 19.01.2016

У вас есть обратная косая черта перед вашим Auth::user() в вашем dd(). Также не могли бы вы заменить Auth::guest() на Auth::check() в вашем app.blade.php?

person Ionut Neculcea    schedule 19.01.2016
comment
Auth::check() возвращает Trying to get property of non-object из app.blade.php. Я читал, что сеанс еще недоступен, когда вызывается представление. Вход, регистрация и мои защищенные страницы используют промежуточное программное обеспечение, и они работают. это страницы, которые его не используют. - person Steve Hernandez; 19.01.2016

У меня была аналогичная проблема. В настроенной моей панели навигации:

@if(Auth::guest())
  <li class="dropdown">
    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
     <i class="fa fa-user"></i> <span class="caret"></span>
    </a>
    <ul class="dropdown-menu" role="menu">
      <li><a href="{{ url('/login') }}">Login</a></li>
      <li><a href="{{ url('/register') }}">Sign Up</a></li>
    </ul>
  </li>
@else
  <li class="dropdown">
    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
     <i class="fa fa-user"></i> {{ Auth::user()->name }}
                               <span class="caret"></span>
    </a>
    <ul class="dropdown-menu" role="menu">
      <li><a href="{{ url('/logout') }}">Logout</a></li>
    </ul>
 </li>            
@endif

Но когда я вхожу в систему, эта панель навигации выдает мне ошибку:

FatalErrorException в строке 63 AliasLoader.php: достигнут максимальный уровень вложенности функции "100", прерывание!

Чтобы решить эту проблему, введите bootstrap/autoload.php и добавьте следующую строку в конец файла:

ini_set('xdebug.max_nesting_level', 120);
person Rafael    schedule 30.11.2016