Laravel сгенерировать ValidationException, но не ударить блок catch метода уничтожения? - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь вернуть пользовательское сообщение об исключении, используя класс Laravel ValidationException. Я успешно работал в следующем примере:

public function store(Request $request)
{
    $this->validate($request, CurrencyValidatorArrays::$store);
    try {
        $this->currenciesInstance->createOrUpdateCurrency($request->all());

        return redirect()->route('currencies.index')
        ->with('success', 'Successfully created currency');
    } catch (Exception $e) {

        return redirect()->route('currencies.create')
        ->with('error', $e->getMessage());
    }
}

, где исключение выдается изнутри createOrUpdateCurrency()

    if(Currency::where('position', $data['position'])->where('id', '!=', $id)->exists()) {

        throw ValidationException::withMessages([
            'error' => ['Position value is already taken']
         ]);
    }

Это затем передает сообщение об исключении обратно в мое представление для отображения .

Однако я пытаюсь реализовать это где-то еще, когда пытаюсь удалить компанию. Я проверяю, что сначала пользователей не существует:

public function destroy($id)
    {
        try {

            $this->companiesInstance->deleteCompany($id);

            return redirect()->route('companies.index')
            ->with('success', 'Successfully deleted company');

        } catch (Exception $e) {

            return redirect()->route('companies.index')
            ->with('error', $e->getMessage());
        }
    }

Внутри deleteCompany():

$company = Company::find($id);
if($company->users()->exists()){
    throw ValidationException::withMessages([
        'error' => ['Position value is already taken']
     ]);
}

По какой-то причине это не затрагивает мой блок catch из основного метода destroy, если я изменяю тип исключения на ValidationException с Exception, я могу получить доступ и увидеть объект исключения, но не в пути Я могу в Store() версии методов. Есть идеи, что здесь происходит?

ОБНОВЛЕНИЕ:

Итак, у меня есть некоторые обходные пути:

Чтобы получить проблему типа исключения, которую я использовал:

catch (ValidationException | Exception $e) { ...

Но это все равно не помогает при доступе к сообщениям об исключениях, поскольку, когда оно имеет тип ValidationException, сообщение проверки конструктора по умолчанию возвращается из getMessage(), а не из указанного мной.

1 Ответ

0 голосов
/ 09 января 2020

PHP 7 обрабатывает исключения немного по-другому. Вы можете прочитать его здесь .

Возвращаясь к своему коду, вы должны попытаться поймать объект Throwable вместо Exception.

try
{
   // Code that may throw an Exception or Error.
}
catch (Throwable $t)
{
   // Code that handles the error
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...