Laravel 中的 try-catch 样板
try-catch boilerplate in Laravel
我想知道 Laravel / PHP 中是否有减少 try-catch 逻辑的方法。例如,我的控制器中有两个方法:
存储方式
public function store(Request $request){
try {
$order = Order::create($request);
} catch(\Exception $e) {
return response()->json([
"message" => 'An error has occured',
"error" => $e->getMessage(),
], 500);
}
}
更新方法
public function update(Request $request){
try {
$order = Order::update($request);
} catch(\Exception $e) {
return response()->json([
"message" => 'An error has occured',
"error" => $e->getMessage(),
], 500);
}
}
可以看出,两种情况下的 try-catch 是相同的,返回相同格式的错误。
有没有办法提取此逻辑并将所有控制器方法包装在同一个 try-catch 块中?
您可以在 /app/Exceptions/Handler.php
:
的 render
方法中捕获并创建您自己的响应
public function render($request, Exception $exception)
{
if ($exception instanceof \Exception) {
return response()->json([
"message" => 'An error has occured',
"error" => $exception->getMessage(),
], 500);
}
// or you might want to catch ModelNotFoundException
// and give same response for all case
else if ($exception instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
return response()->json([
"message" => 'No model found. Please using valid ID',
"error" => $exception->getMessage(),
], 404);
}
return parent::render($request, $exception);
}
小心,因为这种方法会影响所有被捕获的异常
我想知道 Laravel / PHP 中是否有减少 try-catch 逻辑的方法。例如,我的控制器中有两个方法:
存储方式
public function store(Request $request){
try {
$order = Order::create($request);
} catch(\Exception $e) {
return response()->json([
"message" => 'An error has occured',
"error" => $e->getMessage(),
], 500);
}
}
更新方法
public function update(Request $request){
try {
$order = Order::update($request);
} catch(\Exception $e) {
return response()->json([
"message" => 'An error has occured',
"error" => $e->getMessage(),
], 500);
}
}
可以看出,两种情况下的 try-catch 是相同的,返回相同格式的错误。
有没有办法提取此逻辑并将所有控制器方法包装在同一个 try-catch 块中?
您可以在 /app/Exceptions/Handler.php
:
render
方法中捕获并创建您自己的响应
public function render($request, Exception $exception)
{
if ($exception instanceof \Exception) {
return response()->json([
"message" => 'An error has occured',
"error" => $exception->getMessage(),
], 500);
}
// or you might want to catch ModelNotFoundException
// and give same response for all case
else if ($exception instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
return response()->json([
"message" => 'No model found. Please using valid ID',
"error" => $exception->getMessage(),
], 404);
}
return parent::render($request, $exception);
}
小心,因为这种方法会影响所有被捕获的异常