cakephp变量在索引/视图中可用,但在控制器中不可用

时间:2013-05-23 17:41:58

标签: mysql cakephp

我有2个型号/视图/控制器 - 用户和作业

通过Auth方法,我在AppController中设置了以下内容:

$this->set('current_user', $this->Auth->user());

因此,一旦用户登录系统,我就可以使用用户数据。

我在users表中有id,name,email,username等,我有一个名为“group_id”的字段。我在jobs表中也有一个“group_id”字段,我想要做的只是显示记录/允许访问记录,其中来自作业记录的group_id与用户的group_id匹配。

因此,我可以在作业索引视图中使用以下内容:

echo var_dump($current_user);

将打印出类似这样的内容:

array(11) { ["id"]=> string(2) "13" ["firstname"]=> string(2) "My" ["surname"]=> string(4) "Name" ["email"]=> string(25) "myname@anemailaddress.com" ["username"]=> string(6) "myname" ["muso_email_notify"]=> string(1) "0" ["group_id"]=> string(1) "1" ["active"]=> string(1) "0" ["activationID"]=> string(0) "" ["memberaccesslevel"]=> string(1) "0" ["role"]=> string(7) "regular" } 

所以,现在当我选择JobsController中的所有作业时,我想使用这样的东西(可能不太正确):

$this->set('jobs', $this->Job->find('all', array(
    'conditions' => array('Job.group_id' => $current_user['group_id']))));

但是,当我转到Jobs的索引视图时,我得到了未定义的变量错误:

注意(8):未定义的变量:current_user [APP / Controller / JobsController.php,第9行]

我无法弄清楚我做错了什么?变量在视图中起作用,但在控制器逻辑中起作用。

我正在使用带有mysql数据库的蛋糕2.3.4

2 个答案:

答案 0 :(得分:2)

$ this-> set()只是将变量设置为视图,因此在控制器上获取该错误是合乎逻辑的。在控制器中你必须使用

public function someFunction() {
    $current_user = $this->Auth->user();
    echo $current_user['group_id'];
}

如果你想避免在每个函数上执行此操作并且当前用户变量无处不在,请在AppController中执行类似的操作

class AppController extends Controller {
    //create new variable
    public $_current_user = array();

    public function beforeFilter() {
         $this->_current_user = $this->Auth->user();
         $this->set('current_user', $this->_current_user);
    }
}

您将在控制器中使用$this->_current_user并在$current_user

的视图中使用当前用户

无论哪种方式,它都可供您使用,这取决于您希望如何访问变量。无论如何,请记住$this->set()仅用于为视图设置变量。

答案 1 :(得分:0)

对于变量一般,Nunser提供了一些有用的信息。但是,要获取当前登录用户的信息,AuthComponent还具有“静态”界面,允许您在应用程序的任何位置访问用户的信息。

AuthComponent(静态)接口的优点

使用静态界面可以更轻松地访问该信息,并使您的代码更加清晰,因为您不必设置“viewVars”将该信息传递给您的视图/元素,可以减少代码duplucation 如果您需要在多个控制器的不同视图/操作中使用该信息。

例如,要在视图中获取当前用户的group_id,请执行以下操作:

echo AuthComponent::user('group_id');

如前所述,这适用于你应用程序中的任何地方,因此,例如,也可以在Helper中使用(或者甚至在模型中使用,但这可能不是适当的MVC)

有关详细信息,请阅读手册的这一部分:Accessing the logged-in User