CakePHP 3:beforeRender()中的全局变量在JSON视图中覆盖其他变量

时间:2016-11-29 22:27:02

标签: javascript php jquery ajax cakephp

我正在使用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扩展的方法,并从视图中获取全局变量+其他变量。全局变量不应覆盖其他变量。

谢谢!

2 个答案:

答案 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'的正常变量,现在它工作正常。