覆盖处理程序中的异常

时间:2018-04-21 09:05:31

标签: laravel laravel-5

我正在使用产品ID的Route模型绑定,我的路线如下所示:

Route::get('product/{product}', ProductController@index');

我还有一个自定义的ProductNotFoundException,当路由模型绑定仅针对此模型无法获取行(该行不存在或被软删除时)时,我想返回。

我是如何实现这一目标的?

我想到的两个解决方案是:

  1. 删除路线模型绑定(显然:P)
  2. 覆盖例外/处理程序中的例外
  3. 我选择使用第二个并执行以下操作

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Exception               $exception
     *
     * @return \Symfony\Component\HttpFoundation\Response
     * @throws ProductNotFoundException
     */
    public function render($request, Exception $exception)
    {
        if ($exception instanceof ModelNotFoundException && $exception->getModel() === 'App\Models\Product') {
            throw new ProductNotFoundException();
        }
    
        return parent::render($request, $exception);
    }
    

    但是,我不确定在异常处理程序中抛出异常是否是一个好习惯。

    任何人都可以看到上述解决方案的任何其他方式或建议吗?

1 个答案:

答案 0 :(得分:1)

自定义RouteServiceProvider中的绑定分辨率:

Route::bind('product', function ($value) { 
    $product = Product::find($value);
    if ($product === null) {
        throw new ProductNotFoundException();
    }
    return $product;
});

Explicit Model Binding