找不到cakePHP 3.0操作页面控制器::myaction.json(),或者无法访问。“

找不到cakePHP 3.0操作页面控制器::myaction.json(),或者无法访问。“,cakephp,cakephp-3.0,Cakephp,Cakephp 3.0,我正在将现有的2.5应用程序迁移到3.0。在使用ajax时,我遇到了404错误。这在CakePHP2.5中运行良好 url:/cakephp3/pages/myaction.json 我看不到我可能错过的任何一步 我确信这是一个带有.json扩展名的路由问题 routes.php Router::scope('/', function ($routes) { Router::extensions(['json', 'xml']); $routes->connect('/

我正在将现有的2.5应用程序迁移到3.0。在使用ajax时,我遇到了404错误。这在CakePHP2.5中运行良好

url:/cakephp3/pages/myaction.json

我看不到我可能错过的任何一步

我确信这是一个带有.json扩展名的路由问题

routes.php

Router::scope('/', function ($routes) {

    Router::extensions(['json', 'xml']);

    $routes->connect('/', ['controller' => 'Pages', 'action' => 'home']);
    $routes->connect('/hotel-training-courses', ['controller' => 'pages', 'action' => 'trainingCourses']);
    $routes->connect('/feature-tour', ['controller' => 'pages', 'action' => 'features']);
    $routes->connect('/contact-us', ['controller' => 'pages', 'action' => 'contact']);
    $routes->fallbacks('InflectedRoute');
});
PagesController.php

public function initialize()
{
    parent::initialize();
    $this->loadComponent('RequestHandler');
}

public function myaction(){

    $this->request->onlyAllow('ajax');

    $userName = $this->request->data['name'];
    $userCompany = $this->request->data['company'];
    $userEmail = $this->request->data['email'];
    $userPhone = $this->request->data['phone'];

    //send an email

}
以前的应用程序能够检测到请求类型并返回相同类型的请求。无需设置渲染。

必须在作用域之外定义全局扩展 Router::extensions必须放在外部,如果它应该应用于所有路由,则在定义任何作用域和路由之前调用

如果要将扩展解析限制在特定范围内,请使用RouteBuilder::extensions,即

Router::extensions(['json', 'xml']);

Router::scope('/', function (RouteBuilder $routes) {
    $routes->connect('/', ['controller' => 'Pages', 'action' => 'home']);
    //...
});

请求::onlyAllow不再存在 Request::onlyAllow已重命名为Request::allowMethod,因此这是您将遇到的下一个问题

启用调试模式 此外,还应启用调试模式,以便接收带有调试此类问题所需的适当详细信息的有意义的错误消息。

必须在范围之外定义全局扩展 Router::extensions必须放在外部,如果它应该应用于所有路由,则在定义任何作用域和路由之前调用

如果要将扩展解析限制在特定范围内,请使用RouteBuilder::extensions,即

Router::extensions(['json', 'xml']);

Router::scope('/', function (RouteBuilder $routes) {
    $routes->connect('/', ['controller' => 'Pages', 'action' => 'home']);
    //...
});

请求::onlyAllow不再存在 Request::onlyAllow已重命名为Request::allowMethod,因此这是您将遇到的下一个问题

启用调试模式
此外,您还应启用调试模式,以便接收带有调试此类问题所需的适当详细信息的有意义的错误消息。

请不要剪掉一半可能相关的代码…还有其他路由吗?操作的其余部分做什么?没有,没有其他路由。我只有一个作用域。操作没有任何作用t、 我没有复制上一个版本的代码。我测试了返回序列化数组,以检查操作是否未将任何内容转换为默认值404。但没有区别。请不要剪掉可能相关的代码的一半…还有其他路由吗?其余的操作做什么?没有,没有其他路由。我只有一个作用域。该操作尚未执行任何操作,我尚未复制上一版本的代码。我测试了返回序列化数组以检查操作是否未执行任何操作,默认值为404。但没有区别。谢谢,移动路由器::extensions['json',xml'];在范围外工作。我误解了文档,因为示例中的文档在范围内。是的,我在本文之后重新阅读文档时发现了Request::allowMethod。谢谢,移动路由器::extensions['json',xml'];在范围外工作。我误解了文档,因为示例将其包含在范围内。是的,我在本文之后重新阅读文档时发现了请求::allowMethod。谢谢