CakePHP 3.5重定向丢失控制器异常

时间:2018-04-26 09:31:08

标签: cakephp cakephp-3.0

我正在使用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']);

然而,这根本不起作用,所以我搜索了很多,结果发现你应该抓住一个丢失的控制器激活而不是重新路由。我无法找到可以捕获错误的位置,并且很少有人写过它。

有没有人已经与它有关?

2 个答案:

答案 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文件仍应显示原始异常。

祝你好运!

潜在问题2 - CakePHP> = 3.6.x

正如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