我从Laravel开始,想要了解有关使用错误处理的更多信息,尤其是ModelNotFoundException
对象。
<?php
class MenuController extends BaseController {
function f() {
try {
$menus = Menu::where('parent_id', '>', 100)->firstOrFail();
} catch (ModelNotFoundException $e) {
$message = 'Invalid parent_id.';
return Redirect::to('error')->with('message', $message);
}
return $menus;
}
}
?>
在我的模特中:
<?php
use Illuminate\Database\Eloquent\ModelNotFoundException;
class Menu extends Eloquent {
protected $table = 'categories';
}
?>
当然,对于我的例子,“#”类别中没有记录。有parent_id > 100
这是我的单元测试。所以我期待与ModelNotFoundException
做点什么。
如果我在浏览器中运行http://example.co.uk/f,我会收到:
Illuminate \ Database \ Eloquent \ ModelNotFoundException
No query results for model [Menu].
laravel错误页面 - 这是预期的,但我如何重定向到我的路线&#39;错误&#39;使用预定义的消息?即。
<?php
// error.blade.php
{{ $message }}
?>
如果你能给我一个例子。
答案 0 :(得分:13)
默认情况下,Laravel
在app/start/global.php
中声明了一个错误处理程序,如下所示:
App::error(function(Exception $exception, $code) {
Log::error($exception);
});
如果没有声明其他特定处理程序,则此处理程序基本上捕获每个错误。要声明特定的(仅针对一种类型的错误),您可以在global.php
文件中使用以下内容:
App::error(function(Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
// Log the error
Log::error($exception);
// Redirect to error route with any message
return Redirect::to('error')->with('message', $exception->getMessage());
});
最好全局声明错误处理程序,这样您就不必在每个模型/控制器中处理错误处理程序。要声明任何特定的错误处理程序,请记住在它之后(默认错误处理程序)声明它,因为错误处理程序从大多数传播到特定错误处理程序。
详细了解Errors & Logging。
答案 1 :(得分:8)
只需使用命名空间
try {
$menus = Menu::where('parent_id', '>', 100)->firstOrFail();
}catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
$message = 'Invalid parent_id.';
return Redirect::to('error')->with('message', $message);
}
或者将其引用到带别名的外部名称
use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundException;
答案 2 :(得分:0)
尝试一下
try {
$user = User::findOrFail($request->input('user_id'));
} catch (ModelNotFoundException $exception) {
return back()->withError($exception->getMessage())->withInput();
}
要显示错误,请在刀片文件中使用此代码。
@if (session('error'))
<div class="alert alert-danger">{{ session('error') }}</div>
@endif
当然要使用控制器的顶部
use Illuminate\Database\Eloquent\ModelNotFoundException;
答案 3 :(得分:0)
在Laravel 8.x和更高版本中使用render()
函数时,将遇到500 Internal Server Error
。这是因为使用Laravel 8.x会在register()
函数中检查错误(请检查this link)
我在这里留下一个工作示例:
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Throwable;
class Handler extends ExceptionHandler
{
public function register()
{
$this->renderable(function (ModelNotFoundException $e, $request) {
return response()->json(['status' => 'failed', 'message' => 'Model not found'], 404);
});
$this->renderable(function (NotFoundHttpException $e, $request) {
return response()->json(['status' => 'failed', 'message' => 'Data not found'], 404);
});
}
}