cakePHP 3.0 Action PagesController :: myaction.json()找不到,或者无法访问。"

时间:2015-04-16 22:49:52

标签: cakephp cakephp-3.0

我正在将现有的2.5应用迁移到3.0。使用ajax时出现404错误。这在cakePHP 2.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

}

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

1 个答案:

答案 0 :(得分:4)

必须在范围之外定义全局扩展

Router::extensions()必须放在外面,以防它应该适用于所有路由,在定义任何范围和路由之前调用。

如果您想将扩展名解析限制在特定范围内,请使用RouteBuilder::extensions(),即

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

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

Router::scope('/', function (RouteBuilder $routes) {
    $routes->extensions(['json', 'xml']);

    $routes->connect('/', ['controller' => 'Pages', 'action' => 'home']);
    //...
});

参见 Cookbook > Routing > Routing File Extensions

Request :: onlyAllow()不再存在

Request::onlyAllow()已重命名为Request::allowMethod(),因此这是您接下来会遇到的下一个问题。

启用调试模式

此外,您应该启用调试模式,以便接收有意义的错误消息,其中包含调试此类问题所需的相应详细信息。