Я использую Laravel 5.5 и хочу обрабатывать свои пользовательские исключения из пользовательских обработчиков, а не из app\Exceptions\Handler.php. Теперь я перехватываю исключение, если какое-то поле в форме, отправленной пользователем, пусто. Он отлично работает вот так:
ProfileController.php:
public function update(Request $request, $id){
$this->guzzleService->put(
$request,
ApiEndPoints::UPDATE_PROFILE . $id,
true
);
return back()->with('SavedCorrectly', 'Changes saved correctly');
}
приложение \ Исключения \ Handler.php
public function render($request, Exception $exception)
{
if ($exception instanceof ClientException && $exception->getCode() == 422)
return back()->withErrors(
json_decode((string) $exception->getResponse()->getBody(), TRUE)["errors"]
);
return parent::render($request, $exception);
}
Проблема в том, что я хочу его реорганизовать, чтобы он оставался таким:
ProfileController.php
public function update(Request $request, $id){
try {
$this->guzzleService->put(
$request,
ApiEndPoints::UPDATE_PROFILE . $id,
true
);
return back()->with('SavedCorrectly', 'Cambios guardados correctamente');
} catch(ClientException $exception) {
if ($exception->getCode() == 500) throw new InternalServerErrorException;
if ($exception->getCode() == 422) throw new UnprocessableEntityException;
}
}
приложение \ Исключения \ HttpExceptions \ UnprocessableEntityException.php
<?php
namespace App\Exceptions\HttpExceptions;
use GuzzleHttp\Exception\ClientException;
class UnprocessableEntityException extends \Exception
{
public function render($request, ClientException $exception)
{
return back()->withErrors(
json_decode((string) $exception->getResponse()->getBody(), TRUE)["errors"]
);
}
}
Но я получаю эту ошибку:
Type error: Argument 2 passed to App\Exceptions\HttpExceptions\UnprocessableEntityException::render() must be an instance of GuzzleHttp\Exception\ClientException, none given, called in ... \vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php on line 169






это потому, что вы передаете новое исключение
public function update(Request $request, $id){
try {
$this->guzzleService->put(
$request,
ApiEndPoints::UPDATE_PROFILE . $id,
true
);
return back()->with('SavedCorrectly', 'Cambios guardados correctamente');
} catch(ClientException $exception) {
if ($exception->getCode() == 500) throw new InternalServerErrorException((string) $exception->getResponse()->getBody());
if ($exception->getCode() == 422) throw new UnprocessableEntityException((string) $exception->getResponse()->getBody());
}
}
а также
<?php
namespace App\Exceptions\HttpExceptions;
use GuzzleHttp\Exception\ClientException;
class UnprocessableEntityException extends \Exception
{
public function render($request)
{
return back()->withErrors(
json_decode((string) $this->message, TRUE)["errors"]
);
}
}
Спасибо. Это сработало. Я подозревал причину, но не знал, как это сделать.