Я пытаюсь вернуть пользовательское сообщение об исключении, используя класс 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()
, а не из указанного мной.