在我讲代码之前,让我解释一下我的目标。我的网络应用程序显示销售的车辆。我有一个自定义404页面,将显示最新的车辆添加到数据库中,如果用户试图访问一个不存在的页面12需要。
我有以下…
App\Exceptions\CustomException.php
<?php
namespace App\Exceptions;
use Exception;
class CustomException extends Exception
{
public function __construct()
{
parent::__construct();
}
}
App\Exceptions\CustomHandler.php
<?php
namespace App\Exceptions;
use Exception;
use App\Exceptions\Handler as ExceptionHandler;
use Illuminate\Contracts\Container\Container;
use App\Project\Frontend\Repo\Vehicle\EloquentVehicle;
use Illuminate\Foundation\Exceptions\Handler;
use Illuminate\Support\Facades\View;
class CustomHandler extends ExceptionHandler
{
protected $vehicle;
public function __construct(Container $container, EloquentVehicle $vehicle)
{
parent::__construct($container);
$this->vehicle = $vehicle;
}
/**
* Report or log an exception.
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param \Exception $exception
* @return void
*/
public function report(Exception $exception)
{
parent::report($exception);
}
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $exception
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $exception)
{
$exception = Handler::prepareException($exception);
if($exception instanceof CustomException) {
return $this->showCustomErrorPage();
}
return parent::render($request, $exception);
}
public function showCustomErrorPage()
{
$recentlyAdded = $this->vehicle->fetchLatestVehicles(0, 12);
return View::make('errors.404Custom')->with('recentlyAdded', $recentlyAdded);
}
}
为了测试这一点,我添加了
throw new CustomException();
我的控制器,但它不会带来404自定义视图。我要怎么做才能让它工作?
更新:只是给任何将类绑定到模型的人的一个说明。如果你试图使用以下方法访问类中的函数,你会得到BindingResolutionException:
app(MyClass::class)->functionNameGoesHere();
要解决这个问题,只需以将类绑定到服务提供程序中的Container的相同方式创建一个变量。
我的代码如下所示:
protected function showCustomErrorPage()
{
$eloquentVehicle = new EloquentVehicle(new Vehicle(), new Dealer());
$recentlyAdded = $eloquentVehicle->fetchLatestVehicles(0, 12);
return view()->make('errors.404Custom')->with('recentlyAdded', $recentlyAdded);
}
Amit版本
protected function showCustomErrorPage()
{
$recentlyAdded = app(EloquentVehicle::class)->fetchLatestVehicles(0, 12);
return view()->make('errors.404Custom')->with('recentlyAdded', $recentlyAdded);
}
3条答案
按热度按时间zpqajqem1#
**第一步:**创建自定义Exception
php artisan make:exception CustomException
**步骤2:**在代码中包含该异常
use App\Exceptions\CustomException;
将您的错误传递给该Exception
**第三步:在report()和render()**方法中处理CustomException文件中的异常
例如,如果我想以JSON格式显示错误,
xjreopfe2#
Laravel调用
App\Exceptions\Handler
类的render
函数。所以覆盖它是行不通的。你必须只在
App\Exceptions\Handler
类中添加它。举例来说:
yfwxisqw3#
在Laravel的新版本中,您可以使用以下命令创建自定义处理程序:
然后,您应该在自定义处理程序中调用这些方法“report(),render()”,它们将覆盖
App\Exceptions\Handler
中现有的方法。report()用于记录错误。
render()用于重定向返回错误或返回HTTP响应(如您自己的Blade文件)或构建API。
有关更多信息,您可以查看Laravel文档。