我正在使用CakePHP 3.3.9。好吧,我的问题是:当我向行动发送ajax get请求时,它不起作用。我使用"前缀路由"。我发现了很多关于如何在CakePHP 3中处理Ajax的帖子,但在我的例子中没有任何工作!
这是我的代码:
// routes.php
Router::extensions('json');
...
Router::prefix('myagendas', function ($routes) {
$routes->connect('/agendas', ['controller' => 'agendas', 'action' => 'test']);
$routes->fallbacks(DashedRoute::class);
});
。
// AppController.php
$this->loadComponent('RequestHandler');
// AgendasAppController.php
namespace App\Controller\Agendas;
use App\Controller\AppController;
use Cake\Event\Event;
class AgendasAppController extends AppController {
// there's no code here yet.. I'm just extending the AppController that has all the configs..
}
// AgendasController.php
...Extending AgendasAppController.php...
public function test() {
$test = 'not ok';
if ($this->request->is('ajax')) {
$test = 'ok';
}
$this->set(compact('test', $test));
$this->set('_serialize', ['test']);
}
// scripts.js
$('#btnAdd').click(function () {
$.ajax({
type: 'GET',
url: './myagendas/agendas/test', //myagenda is a prefix
dataType: 'json',
success: function (data) {
console.log(data);
},
error: function (jqXHR, textStatus, errorThrown) {
console.log(jqXHR);
}
});
});
我在JS控制台中收到此错误:
Fatal error</b>: Call to a member function config() on a non-object in AppController.php
更新
我发现了错误!
在myRender()的AppController中,我设置了一个全局变量来检查用户是否已登录。问题是:当我在Ajax中收到数据时,它无法从请求中获取变量,因为当我访问.json扩展名时,beforeRender中的全局变量会覆盖其他变量
。
// AppController.php
if ($this->request->session()->read('Auth.User.role') == 'admin') {
$this->set('loggedIn', true);
$this->set('_serialize', ['loggedIn']);
} else {
$this->set('loggedIn', false);
$this->set('_serialize', ['loggedIn']);
}
我需要什么:
现在我需要找到一种从视图访问.json扩展的方法,并从视图中获取全局变量+其他变量。全局变量不应覆盖其他变量。
谢谢!
答案 0 :(得分:0)
你可能做错了在这里:
class AgendasAppController extends AppController {
// there's no code here yet.. I'm just extending the AppController that has all the configs..
}
应该是这样的:
class AgendasController extends AppController {
}
答案 1 :(得分:0)
问题是AppController中的变量'loggedIn'正在使用'_serialize'并覆盖其他变量,因为它在beforeRender()方法中是全局的。我只需要设置一个没有'_serialize'的正常变量,现在它工作正常。