Laravel return response () не остановить выполнение - PullRequest
0 голосов
/ 17 апреля 2020

Я не могу найти объяснение того, почему return response() внутри catch не останавливает выполнение, я думаю, что я что-то упустил.

В этом примере запрос имеет ошибку, поэтому попытайтесь - поймай на сервисе, получи ValidationException. Это переходит к ValidationErrorResponder, и здесь выполнение должно завершиться sh и вернуть json с ошибками. Но он продолжается и возвращает сообщение об ошибке json через $this->updateUserResponder->respond()

У меня есть определенный маршрут, который выполняет метод __invoke() для UpdateUserAction

class UpdateUserAction
{
    protected $updateUserService;

    protected $updateUserResponder;

    public function __construct(UpdateUserService $updateUserService, UpdateUserResponder $updateUserResponder)
    {
        $this->updateUserService = $updateUserService;
        $this->updateUserResponder = $updateUserResponder;
    }

    public function __invoke(Request $request, $userId)
    {
        $serviceData = [
            'id' => $userId,
            'commandPayload' => $request->only('name')
        ];

        return $this->updateUserResponder->respond($this->updateUserService->execute($serviceData));
    }
}
class UpdateUserService extends BaseService
{
    public function execute(array $data = [])
    {
        try {
            $this->bus->addHandler(UpdateUserCommand::class, UpdateUserHandler::class);
            return $this->bus->dispatch(UpdateUserCommand::class, $data, [UpdateUserValidator::class]);
        } catch (ValidationException $e) {
            return $this->validationErrorResponder->respond($e);
        }
    }
}
class UpdateUserValidator implements Middleware
{
    protected $rules = [
        'id' => 'uuid',
        'commandPayload.name' => 'max:256'
    ];

    protected $messages = [];

    public function execute($command, callable $next)
    {
        $validator = Validator::make((array) $command, $this->rules, $this->messages);

        if ($validator->fails()) {
            throw new ValidationException($validator);
        }
        return $next($command);
    }
}

Этот ответ должен возвращать окончательный ответ с ошибками в JSON, но

class ValidationErrorResponder
{
    public function respond($validator)
    {
        $messages = $validator->getValidator()->getMessageBag()->messages();

        return response()->json(['errors' => $messages], 422);
    }
}

1 Ответ

0 голосов
/ 18 апреля 2020

Может быть, ошибка в другом, и перехват не работает, потому что только перехватывает ValidationException .

Поэтому попробуйте перехватить все исключения, чтобы увидеть, что происходит:

class UpdateUserService extends BaseService
{
    public function execute(array $data = [])
    {
        try {
            $this->bus->addHandler(UpdateUserCommand::class, UpdateUserHandler::class);
            return $this->bus->dispatch(UpdateUserCommand::class, $data, [UpdateUserValidator::class]);
        } catch (\Exception $e) {
            return $this->validationErrorResponder->respond($e);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...