Laravel 所有 404 异常
Laravel all exceptions to 404
问题很简单。使用 laravel 5.6
例如,我有这条路线
Route::get('/services/{id}/{service}', ['as'=> 'services.show', 'uses' => 'ServicesController@show']);
我在控制器内部做一些奇特的逻辑。
问题是:除了 laravel 中的典型 ErrorException 页面之外,还有其他优雅的方法可以在控制器内部发生故障时抛出 404 吗? (这不是 404)。
一个简单的例子可能是 id 没有插入到数据库中,所以这使得应用程序失败,没有返回 404。
我想一个解决方案应该是插入一个 try catch 条件,如果它失败渲染(404)..或多或少..
你可以试试这个
try{
... your fancy code here
}catch(Exception $e){
abort(404, 'Custom 404 error message');
}
转到app/Exceptions
如果有render方法修改它,或者添加方法。
例如:
public function render($request, Exception $exception)
{
if($exception instanceof NotFoundHttpException){
return response()->view('errors/404', ['invalid_url'=>true], 404);
}
if ($exception instanceof TokenMismatchException && Auth::guest()) {
error_log('Error :' . $exception->getMessage());
abort(500);
}
if ($exception instanceof TokenMismatchException && getenv('APP_ENV') != 'local') {
return redirect()->back()->withInput();
}
if($exception instanceof \Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException && getenv('APP_ENV') != 'local') {
error_log('Error :' . $exception->getMessage());
abort(404);
}
if(($exception instanceof PDOException || $exception instanceof QueryException) && getenv('APP_ENV') != 'local') {
error_log('Error :' . $exception->getMessage());
abort(500);
}
if ($exception instanceof ClientException) {
error_log('Error :' . $exception->getMessage());
abort(500);
}
return parent::render($request, $exception);
}
有一种优雅的方式可以做你想做的事。 Laravel 在您的 App/Exceptions 目录中有一个名为 Handler.php 的文件。此文件包含 class 称为 Handler 并且有 render 方法。而已!您应该使用此方法将所有异常转换为 404 异常,如下所示:
/**
* @param $request
* @param Exception $exception
* @return mixed
*/
public function render($request, Exception $exception)
{
// you could do abort(404) if you prefer helpers
$notFoundException = new NotFoundHttpException($exception->getMessage());
return parent::render($request, $notFoundException);
}
问题很简单。使用 laravel 5.6
例如,我有这条路线
Route::get('/services/{id}/{service}', ['as'=> 'services.show', 'uses' => 'ServicesController@show']);
我在控制器内部做一些奇特的逻辑。
问题是:除了 laravel 中的典型 ErrorException 页面之外,还有其他优雅的方法可以在控制器内部发生故障时抛出 404 吗? (这不是 404)。
一个简单的例子可能是 id 没有插入到数据库中,所以这使得应用程序失败,没有返回 404。
我想一个解决方案应该是插入一个 try catch 条件,如果它失败渲染(404)..或多或少..
你可以试试这个
try{
... your fancy code here
}catch(Exception $e){
abort(404, 'Custom 404 error message');
}
转到app/Exceptions 如果有render方法修改它,或者添加方法。
例如:
public function render($request, Exception $exception)
{
if($exception instanceof NotFoundHttpException){
return response()->view('errors/404', ['invalid_url'=>true], 404);
}
if ($exception instanceof TokenMismatchException && Auth::guest()) {
error_log('Error :' . $exception->getMessage());
abort(500);
}
if ($exception instanceof TokenMismatchException && getenv('APP_ENV') != 'local') {
return redirect()->back()->withInput();
}
if($exception instanceof \Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException && getenv('APP_ENV') != 'local') {
error_log('Error :' . $exception->getMessage());
abort(404);
}
if(($exception instanceof PDOException || $exception instanceof QueryException) && getenv('APP_ENV') != 'local') {
error_log('Error :' . $exception->getMessage());
abort(500);
}
if ($exception instanceof ClientException) {
error_log('Error :' . $exception->getMessage());
abort(500);
}
return parent::render($request, $exception);
}
有一种优雅的方式可以做你想做的事。 Laravel 在您的 App/Exceptions 目录中有一个名为 Handler.php 的文件。此文件包含 class 称为 Handler 并且有 render 方法。而已!您应该使用此方法将所有异常转换为 404 异常,如下所示:
/**
* @param $request
* @param Exception $exception
* @return mixed
*/
public function render($request, Exception $exception)
{
// you could do abort(404) if you prefer helpers
$notFoundException = new NotFoundHttpException($exception->getMessage());
return parent::render($request, $notFoundException);
}