CakePHP 3使资源路线在有和没有参数的情况下使用



我在路由文件中有一些代码:

Router::scope('/v1', function (RouteBuilder $routes) {
    $routes->resources( 'Files');
});

,然后是具有删除函数的filescontroller,例如:

public function delete($id){
    echo "here"; exit();
}

当我这样做时:

DELETE http://192.168.1.197/v1/files/1

响应是 here,但是,如果我这样做:

DELETE http://192.168.1.197/v1/files

响应是它缺少V1 Controller。

我期望的是Cakephp转身说"糟糕,您已经通过了错误的必需参数"。

似乎很奇怪的事情似乎正在发生,我不太确定什么。我该如何使两个做同样的事情并指向控制器?

cakephp在启用调试模式时在异常上的操作非常不同。当调试为true时,所有异常都会带有调试信息,堆栈跟踪和开发人员友好的消息。

当调试模式为false时,将异常作为标准HTTP响应类型渲染。使用400和500个错误代码的手柄。

当路由器找不到路由的匹配时,不涉及控制器。HTTP请求永远不会超过调度阶段。这是投掷400型异常的调度员。

在您给定的示例中,框架正在用404的HTTP代码扔一个MissingControllerException

通过ErrorController渲染400个错误代码。CakePHP带有默认错误控制器,但是如果您使用Composer模板生成新应用程序,则应在应用程序的控制器持有器中具有默认的ErrorController

在您的模板中应该有一个src/Template/Error/error400.ctp文件,该文件显示400个代码的响应。请记住,启用调试模式时不会使用此模板。

您可以修改此模板以查找"紧密"匹配路线,并将其作为建议作为反馈在错误消息中。

中的反馈。

您可以像这样轻松迭代所有配置的路线:

    foreach (Router::routes() as $route) {
        $name = isset($route->options['_name']) ? $route->options['_name'] : $route->getName();
        $output[] = [$name, $route->template, json_encode($route->defaults)];
    }

从cakephp/src/shell/rutesshell.php 中获取。

因为这是技术上的404误差。没有匹配的路线,您可以做的就是尝试找到"接近"比赛的路由。这里的问题在于,您面临与路由器类相同的路线匹配挑战。

路由器类使用 dynamic 路由技术,将部分参数填充并填充为控制器的名称,操作的名称和用户定义的参数。

这可以显着更改取决于您使用的默认路由器类。

例如,您可能正在使用DashedRoute路由类,该类执行以下操作:

/**
 * This route class will transparently inflect the controller, action and plugin
 * routing parameters, so that requesting `/my-plugin/my-controller/my-action`
 * is parsed as `['plugin' => 'MyPlugin', 'controller' => 'MyController', 'action' => 'myAction']`
 */
class DashedRoute extends Route

您可能正在使用InflectedRoute路由类,该类可执行以下操作:

/**
 * This route class will transparently inflect the controller and plugin routing
 * parameters, so that requesting `/my_controller` is parsed as `['controller' => 'MyController']`
 */
class InflectedRoute extends Route

由于在某些情况下可以使用动态路由。不可能知道URL段是控制器,操作还是命名参数。

添加您还使用名为/v1的范围的复杂性,预测预期的路线是更具挑战性的。

您可以创建自定义路由以捕获这些边缘案例并呈现信息性错误消息,也可以尝试将逻辑添加到error400.ctp中以显示更有用的错误消息。

还有一个最终选择。CakePHP允许您编写自己的自定义路线类,和/或使用自己的调度员修改中间件。

我完全解决了这种方法,只需停止使用cakephp中的资源路由;我将代码更改为:

$routes->get('/files/*', ['controller' => 'Files', 'action' => 'view'], 'files:get');
$routes->post('/files', ['controller' => 'Files', 'action' => 'add'], 'files:post');
$routes->put('/files/*', ['controller' => 'Files', 'action' => 'edit'], 'files:put');
$routes->patch('/files/*', ['controller' => 'Files', 'action' => 'view'], 'files:patch');
$routes->delete('/files/*', ['controller' => 'Files', 'action' => 'delete'], 'files:delete');

它完全像我想要的问题一样工作...

相关内容

最新更新