В app\Http\Controller
есть класс главного контроллера с именем Controller
который наследует все остальные контроллеры. В любом другом контроллере работает следующий код:
class OtherController extends Controller{ public function index(){ dd(\Auth::user()->id); } }
Тем не менее, в Controller.php
т.е. родительском классе, когда я пытаюсь сделать что-то подобное в методе construct
меня есть Trying для получения свойства ошибки, отличной от объекта :
class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; public $foo = 'null'; public function __construct() { $this->middleware('auth'); dd(\Auth::user()->id);//Error is here. dd(\Route::getCurrentRoute()->action['controller']); } }
Как я могу решить эту проблему?
Изменить, чтобы добавить ответ
Попробуйте объявить этот метод и поместить в него свой код до parent::call_action()
:
public function callAction($method, $parameters) { // Put your code right here // then do this last return parent::callAction($method, $parameters); }
Взято из нижней части этой страницы. Короче говоря, callAction всегда вызывается непосредственно перед вызовом метода назначения, но он также вызывается после запуска промежуточного программного обеспечения, поэтому вы сможете правильно получить доступ к своему фасаду. По всей вероятности, все, что вы пытались сделать в конструкторе, будет работать так, как вы этого хотели в этом методе.
Оригинальный ответ
Это было немного, так как я ткнул в laravel 5.4, но если я правильно помню, промежуточное ПО не срабатывает до тех пор, пока не будет создан конструктор контроллера, а это значит, что вы конкретно не можете делать то, что вы пытаетесь сделать. Среднее промежуточное ПО не заполняет фасад Auth зарегистрированным пользователем до тех пор, пока контроллер не будет сконструирован, но до вызова метода контроллера (поэтому ваш первый пример работает).
Я считаю, что это намеченное поведение, поэтому вряд ли оно изменится.
Короче это (если кто-то более осведомленный меня не исправляет), что вам придется найти другой способ сделать то, что вы пытаетесь сделать.
Изменить для добавления
Действительно, этот вопрос дает понять, что мои подозрения верны. Middleware запускается после конструктора контроллера, что означает, что вы не можете получить доступ к зарегистрированному пользователю внутри конструктора контроллера. В ретроспективе это, очевидно, так, потому что одна вещь, которую вы можете сделать из конструктора контроллера, – это указать, какие средние системы должны запускать. Если промежуточное ПО уже было запущено, вы не сможете этого сделать. Поэтому, не говоря уже о том, что вы не можете (практически) получить доступ к фасаду Auth из конструктора контроллера. Это намеренно со стороны команды laravel, поэтому она не изменится в ближайшее время. Вам нужно будет найти другой способ сделать это.
Я обновляю свой ответ на основе вашей ошибки … убедитесь, что в верхней части файла добавьте use Illuminate\Support\Facades\Auth;
Теперь с laravel 4.2+ легко получить идентификатор пользователя:
$userId = Auth::id();
вот и все.
Но для получения данных пользователя, отличных от id, вы используете:
$email = Auth::user()->email;
Для получения дополнительной информации проверьте защитную часть документации