cakePHP 3.0 操作 PagesController::myaction.json() 找不到或无法访问。”
cakePHP 3.0 Action PagesController::myaction.json() could not be found, or is not accessible."
我正在将现有的 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
}
之前的应用程序能够检测到请求类型并且 return 具有相同的类型。无需设置渲染。
必须在范围之外定义全局扩展
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()
,因此这是您将遇到的下一个问题。
见
启用调试模式
您还应该启用调试模式,以便您收到有意义的错误消息和适当的详细信息,这是调试此类问题所必需的。
我正在将现有的 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
}
之前的应用程序能够检测到请求类型并且 return 具有相同的类型。无需设置渲染。
必须在范围之外定义全局扩展
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()
,因此这是您将遇到的下一个问题。
见
启用调试模式
您还应该启用调试模式,以便您收到有意义的错误消息和适当的详细信息,这是调试此类问题所必需的。