Laravel对404的所有例外

时间:2018-06-19 03:33:25

标签: php laravel laravel-5.6

问题很简单。使用laravel 5.6

我有例如这条路线

Route::get('/services/{id}/{service}', ['as'=> 'services.show', 'uses' => 'ServicesController@show']);

在内部控制器中,我做了一些奇特的逻辑。

问题是:当控制器内的某些内容失败而不是laravel中的典型ErrorException页面时,是否还有其他优雅的方法来抛出404? (这不是404)。

一个简单的例子可能是数据库中没有插入id,因此导致应用程序失败,而不是返回404。

我想一个解决方案应该是插入一个try catch条件,如果它渲染失败(404)..或多或少..

3 个答案:

答案 0 :(得分:2)

转到app / Exceptions 如果有渲染方法改变它,或添加方法。

前:

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);
}

答案 1 :(得分:1)

有一种优雅的方式可以做你想做的事。 Laravel在App / Exceptions目录中有一个名为Handler.php的文件。该文件包含名为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);
}

答案 2 :(得分:0)

你可以试试这个

try{
 ... your fancy code here
}catch(Exception $e){
 abort(404, 'Custom 404 error message');
}