Laravel:如何在View Composer中处理异常

时间:2018-06-21 13:17:21

标签: php laravel exception-handling laravel-5.5

在我的 laravel 5.5 项目中,视图编辑器用于将数据传递到视图。

视图编辑器constructor()中,一个try catch块用于捕获异常,并从捕获中抛出自定义异常方法。

在应用程序的默认异常处理程序中,处理自定义异常以显示我的自定义错误视图。

问题:从视图编辑器抛出自定义异常后,该异常无法正常工作。将显示Laravel的默认异常错误页面,而不是我的自定义错误页面。

ProductComponentComposer.php     

namespace App\Http\ViewComposers;

use Illuminate\View\View;
use App\Repositories\ProductRepository;
use Exception;
use App\Exceptions\AppCustomException;

class ProductComponentComposer
{
    protected $products;

    /**
     * Create a new product partial composer.
     *
     * @param  ProductRepository  $productRepo
     * @return void
     */
    public function __construct(ProductRepository $productRepo)
    {
        try {
            $this->products = $productRepo->getProducts();
        } catch (Exception $e) {
            throw new AppCustomException("CustomError", 1001);
        }
    }

    /**
     * Bind data to the view.
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with(['productsCombo' => $this->products]);
    }
}

Handler.php

public function render($request, Exception $exception)
    {
        if($exception instanceof AppCustomException) {
            //custom error page when custom exception is thrown
            return response()->view('errors.app-custom-exception', compact('exception'));
        }

        return parent::render($request, $exception);
    }

注意::如果自控制器抛出异常,则可以正确处理自定义异常。

我还尝试从 ProductComponentComposer compose()方法而不是__constructor()引发异常。但这也不起作用。

如果在视图编辑器中发生任何异常,如何解决此问题以获取我的自定义异常视图?

先谢谢了。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,即在视图编写器类的方法中引发了自定义异常,但是显示的却是\ErrorException。 我认为是在框架级别(\laravel\framework\src\Illuminate\View\Engines\PhpEngine.php:45)上存在一个处理程序。

解决了我申请的问题:

App \ Exceptions \ Handler.php

public function render($request, Exception $exception)
{
    if ($exception instanceof AppCustomException ||
        $exception instanceof \ErrorException && 
        $exception->getPrevious() instanceof AppCustomException
    ) {
        //custom error page when custom exception is thrown
        return response()->view('errors.app-custom-exception', compact('exception'));
    }
    // default
    return parent::render($request, $exception);
}

确保您真正获得的是\ErrorException

的实例