我正在使用CakePHP抛出的缺少的控制器异常。 一旦调用了未知控制器,它就应该在我的登录页面上重定向。 首先,一旦控制器/动作未知,我就尝试路由到我的标准登录页面。
//default routing
$routes->connect('/:controller', ['action' => 'index'], ['routeClass' => 'InflectedRoute']);
$routes->connect('/:controller/:action/*', [], ['routeClass' => 'InflectedRoute']);
$routes->connect('/', ['controller' => 'Users', 'action' => 'login']);
//redirect if controller is not known
$routes->connect('/*', ['controller' => 'Users', 'action' => 'login']);
然而,这根本不起作用,所以我搜索了很多,结果发现你应该抓住一个丢失的控制器激活而不是重新路由。我无法找到可以捕获错误的位置,并且很少有人写过它。
有没有人已经与它有关?
答案 0 :(得分:1)
据我所知,只能通过自定义Cakephp中的Error Handling流来捕获MissinControllerException
要获得结果,您需要执行以下操作。
如果您在Middleware
课程中使用Application
,则需要通过注释掉这一行来禁用错误处理中间件:
->add(ErrorHandlerMiddleware::class)
接下来,您需要使用自定义的CakePHP错误处理程序覆盖它。因此,在src\Error
中创建文件AppError.php
,其内容与此类似:
class AppError extends ErrorHandler
{
public function _displayException($exception)
{
if($exception instanceof MissingControllerException){
$response = new Response();
$response = $response->withLocation(Router::url(
['controller'=>'Users', 'action'=>'login'])
);
$emitter = new ResponseEmitter();
$emitter->emit($response);
}else{
parent::_displayException($exception);
}
}
}
最后,在bootstrap.php
文件中,您需要注册新的错误处理程序。根据文档,需要添加以下内容:
$errorHandler = new \App\Error\AppError();
$errorHandler->register();
执行此重定向将隐藏所有丢失的控制器异常。如果URL中出现拼写错误,这可能会导致您遇到麻烦,因为您将不再获得明确的错误,而是被重定向到登录页面。 error.log
文件仍应显示原始异常。
正如ndm在评论中指出的那样,禁用错误处理中间件并不总是一个好主意,特别是对于CakePHP 3.6。在这种情况下,更好的解决方案是扩展ErrorHandling中间件并注册它。
答案 1 :(得分:1)
您可以尝试使用自定义异常呈现器来处理此异常:
在src / Error中创建一个名为MyExceptionRenderer.php的新文件,并在那里处理缺少的控制器异常:
namespace App\Error;
use Cake\Error\ExceptionRenderer;
class MyExceptionRenderer extends ExceptionRenderer
{
public function missingController($error)
{
return $this->controller->redirect("/");
}
}
您还需要在config / app.php中启用此自定义渲染器:
'Error' => [
'errorLevel' => E_ALL,
'exceptionRenderer' => 'App\Error\MyExceptionRenderer',
'skipLog' => [],
'log' => true,
'trace' => true,
],
这样,当引发MissingControllerException时,将重定向用户,在本例中为主页。
可以在此处找到更多信息:Error Handling