Как вызвать метод, функцию или инициализировать класс после промежуточного программного обеспечения в конструкторе контроллера в Laravel и Lumen?

#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. Я добавил еще один пример.