Не могу поделиться Auth :: check() в приложении Http Controllers Controller через view()-> поделиться

#php #laravel #laravel-5 #laravel-5.3

#php #laravel #laravel-5 #laravel-5.3

Вопрос:

Я хочу поделиться в каждом представлении результатом аутентификации:: check() в виде переменной $ signedIn, я обнаружил, что могу сделать это через родительский контроллер в Laravel. Это работает хорошо, но не хочет работать для Auth:: check() — ничего не возвращает.

Код для родительского контроллера

     namespace AppHttpControllers;

    use IlluminateFoundationBusDispatchesJobs;
    use IlluminateRoutingController as BaseController;
    use IlluminateFoundationValidationValidatesRequests;
    use IlluminateFoundationAuthAccessAuthorizesRequests;
    use IlluminateSupportFacadesAuth;


    class Controller extends BaseController
    {
        use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

        public function __construct()
        {
            view()->share('signedIn', Auth::check());
        }
    }
  

Код представления, в котором я использую переменную $signedIn, упомянутую ранее

 @if($signedIn)

    @include('question.answer-form')

@else

    <div class="alert alert-warning">
        <p>
            <a href="{{ url('login') }}">Sign in</a> in order to answer a question
        </p>
    </div>

@endif
  

В конструкторе контроллера, с которого я перенаправляю на view, я вызвал родительский конструктор — проблема в том, что он не хочет работать для Auth::check().

Laravel 5.3v.

Ответ №1:

Вы должны размещать вызовы для совместного использования в методе загрузки поставщика услуг

источник: https://laravel.com/docs/5.3/views#sharing-data-with-all-views

 <?php

namespace AppProviders;

use IlluminateSupportFacadesView;
use IlluminateSupportFacadesAuth;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::share('signedIn', Auth::check());
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
  

Комментарии:

1. Хотя я согласен с @Alexey, что это не похоже на что-то полезное для совместного использования (возможно, совместное использование auth ()-> user () было бы), это, кажется, лучший способ поделиться переменной со всеми представлениями приложения.

Ответ №2:

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

попробуйте это :

 public function __construct()
{
     $this->middleware(function ($request, $next) {
          view()->share('signedIn', Auth::check());

          return $next($request);
     });
}
  

Документы

Ответ №3:

Передача Auth::check() результата в views не имеет никакого смысла, поскольку Auth он доступен во всех views по умолчанию, так же как и auth() global helper. Поэтому просто используйте одну из этих проверок в любом блейд-представлении. Все они делают то же самое:

 @if (Auth::check())
@if (auth()->check())
@if (Auth::user())
@if (auth()->user())
  

Комментарии:

1. Я знаю об этих проверках, просто хотел добавить эти переменные, чтобы сделать код немного чище

2. На мой взгляд, auth()->check() более удобочитаемо, чем какая-либо переменная. Вы всегда знаете, что именно делает этот код. Сохраняйте это простым. )