У меня есть маршрут с некоторыми пользовательскими промежуточными программами и контроллер, подключенный к этому маршруту.
Когда я попадаю в свой контроллер, мне нужно проверить пользовательский объект (переданный в запросе), чтобы прервать действие контроллера, если это необходимо.
public function myControllerFunction(Request $request){
...
if(isset($data["data-key"])){
abort(Response::HTTP_BAD_REQUEST, "custom abort message");
}
...
//do other call
}
Запущено действие отмены, я вижу его в своем журнале с соответствующим сообщением, НО промежуточное ПО продолжает выполнение и попадает в другую ошибку (из-за прерывания в контроллере, которое прерывается перед вызовом другогометод).Поэтому первоначальное сообщение об ошибке ответа перезаписывается.
Моя цель - остановить выполнение моего кода в контроллере и остановить выполнение промежуточного программного обеспечения, установленного как «после».Я ожидал, что прерывание отменит все выполнение кода.
Я попытался с throw Exception(…)
, но результат тот же, с пользовательским исключением, но безуспешно.Я также попытался с помощью кода в стиле фанк в промежуточном программном обеспечении (где я проверяю, есть ли уже сообщение об ошибке или исключение в запросе), но это не правильно делать в этом месте.
Почемупрерывание, не отменяющее выполнение кода?
для получения дополнительной информации мой маршрутизатор выглядит следующим образом:
$router->post(
'path',
[
'as' => 'element.functionName',
'uses'=>'ElementResourceController@myControllerFunction',
'middleware' => [
'middleware-before-1',
'middleware-before-2',
'middleware-before-3',
'middleware-after-1',
'middleware-after-2',
'middleware-after-3'
],
]
);
my before middleware выглядит следующим образом
public function handle(Request $request, Closure $next){
// do things
if(this){
//do that
}
return $next($request);
}
мое промежуточное ПО
public function handle(Request $request, Closure $next){
$resp = $next($request);
///do things
//other error at this line, because abort in controller did not work as expected
//this middleware should not be executed
$element = Element::findOrFail($resp->getData()->key);
return $resp;
}