#php #laravel #lumen
Вопрос:
Как вызвать метод, функцию или инициализировать класс после промежуточного программного обеспечения в конструкторе контроллера в Laravel и Lumen?
Я пытаюсь инициализировать класс Translator
после middleware('lang')
, но класс Translator
инициализируется перед выполнением middleware('lang')
.
Controllers/IndexController.php
lt;?php namespace AppHttpControllers; use LaravelLumenRoutingController; use AppHelpersTranslator; class IndexController extends Controller { private $transhome; public function __construct() { $this-gt;middleware('lang'); $this-gt;transhome = new Translator('home'); } public function home() { return view('home', [ 'transhome' =gt; $this-gt;transhome, ]); } }
Middleware/LangMiddleware.php
use Closure; class LangMiddleware { /** * Handle an incoming request. * * @param IlluminateHttpRequest $request * @param Closure $next * @return mixed */ public function handle($request, Closure $next) { config(['app.lang' =gt; 'fr']); return $next($request); } }
Еще один пример
После выполнения мы увидим: 132
$this-gt;middleware('lang');
последний будет называться
Controllers/IndexController.php
lt;?php namespace AppHttpControllers; use LaravelLumenRoutingController; class IndexController extends Controller { public function __construct() { echo '1'; $this-gt;middleware('lang'); echo '3'; } public function home() { return view('home'); } }
Middleware/LangMiddleware.php
use Closure; class LangMiddleware { /** * Handle an incoming request. * * @param IlluminateHttpRequest $request * @param Closure $next * @return mixed */ public function handle($request, Closure $next) { echo '2'; return $next($request); } }
Комментарии:
1. вы не запускаете промежуточное программное обеспечение с помощью этого
middleware
метода, вы просто устанавливаете индекс массива на контроллере … контроллер создан, и маршрутизатор запрашивает у него, какое промежуточное программное обеспечение он определяет, но оно еще не запускает их … вы хотели бы зарегистрировать «промежуточное программное обеспечение контроллера» (анонимную функцию), чтобы оно выполнялось как промежуточное программное обеспечение в стеке после другого … по крайней мере, в Ларавеле2. @lagbox Ты имеешь в виду? —
Controllers also allow you to register middleware using a closure.
? В не работает:$this-gt;middleware(function ($request, $next) { return $next($request); });
я получаю ошибку — Незаконный тип смещения3. в Laravel вы определенно можете, у меня нет настройки проекта Lumen, чтобы попробовать его
4. @lagbox Спасибо.
5. другим методом было бы создание промежуточного программного обеспечения, которое назначило бы эту переменную вашему контроллеру, в Laravel вы можете получить контроллер из текущего маршрута, из запроса, а затем вы могли бы назначить переменную контроллеру в промежуточном программном обеспечении … опять же, у меня нет проекта Lumen для тестирования, так как он делает некоторые вещи по-другому (например, использует другой маршрутизатор).
Ответ №1:
На самом деле, это должно сработать, потому что у вас есть $transhome, как private
указано выше. Попробуйте это с public
помощью .
Это должно работать, потому что в конструкторе вы говорите ему установить его в переводчик.
Вы когда-нибудь смотрели dd()
, вернется ли transhome null
?
Комментарии:
1. Спасибо, но
$this-gt;middleware('lang')
позвонил позжеTranslator
. Если я заменюTranslator
var_dump("222");
, то первое выполнение будетvar_dump ("222");
.2. Я добавил еще один пример.