#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()
более удобочитаемо, чем какая-либо переменная. Вы всегда знаете, что именно делает этот код. Сохраняйте это простым. )