0

我正在使用 cakephp 2.3.0。我在手册中搜索了很长时间并搜索了互联网,但我没有找到答案。这是我的高级场景:

** 基本上,我只是想向选项数组添加一个变量和一个值,这样当 cakephp 构建 SQL 插入到语句时,它就有这个必需的列和值。**

  • 用户使用用户名和密码登录网页
  • 在控制器中,我使用模型来查询我的用户表以获取用户的 id #
  • 我将 ID # 放入会话变量中
  • 接下来,用户登录,然后填写网络表单并提交
  • 在我的控制器中,我尝试将存储在会话变量中的 id 的值添加到模型的选项数组中(这是我的麻烦所在)......请参阅下面的详细信息

在我的用户控制器中,我有这个代码片段:

public function login() {
        if ($this->request->is('post')) {
            if ($this->Auth->login()) {                    
                $condition = array("User.username" => $this->request->data['User']['username']);
                $this->Session->write('userId', $this->User->find('first', 
                            array (
                            'conditions' => array ($condition),
                            'fields' => array ('User.id'))));                   
                $this->redirect($this->Auth->redirect());                   
            } else {
                $this->Session->setFlash(__('Invalid username or password, try again'));
            }
        }
    }

在我的活动控制器中,我有这个:

class ActivitiesController extends AppController {

    var $components = array('Session');

    public function createActivity() {
        if ($this->request->is('post')) {
              $this->Activity->create();
             $user = $this->Session->read('userId');
            //debug($user);
            debug($user['User']['id']);
            $ownerID = ($user['User']['id']);
            $this->Activity->set(array('owner_id' => $ownerID));
            if ($this->Activity->save($this->request->data)) {
                $this->Session->setFlash(__('The user has been saved'));
                $this->redirect(array('action' => 'home'));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
            }
        }

我的调试将打印一个值 5,这是我希望看到的。但是,我得到的是一个数据库错误,它在网页上输出 SQL INSERT INTO 代码,它告诉我我的 owner_id 不能为 NULL。这是正确的,因为这就是我在数据库表中设置它的方式。

因此,当尝试将会话变量中的 ID 值放入我的选项数组时,我得到了一个 NULL。我仍然认为自己更像是 cakephp 的初学者。任何帮助,将不胜感激。谢谢。

4

2 回答 2

2

您正在尝试做框架已经做的事情。

登录功能不需要更多:

public function login() {
    if ($this->request->is('post')) {
        if($this->Auth->login()){
            $this->Session->setFlash('Your logged in now.');
            $this->redirect( array('controller' => 'activities', 'action' => 'createActivity'));
        }
        else{
            $this->Session->setFlash('Username or password is incorrect', 'default', array(), 'auth');
        }
    }
}

在你的活动控制器中

public function createActivity() {
    if ($this->request->is('post')) {
        $this->request->data['Activity']['user_id'] = $this->Auth->user('id');
        $this->Activity->create();
        if ($this->Activity->save($this->request->data)) {
            $this->Session->setFlash(__('The user has been saved'));
            $this->redirect(array('action' => 'home'));
        } else {
            $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
        }
    }

AppController 应该包含

App::uses('Controller', 'Controller');

class AppController extends Controller {

    public $components = array(
        'Auth',
        'Session',
    );

}

也建议遵循 Cake 的约定,如果你将 Activity 链接到 User,则将外键名称设置为 user_id 而不是 owner_id 模型关联

于 2013-03-18T08:44:43.070 回答
1

不要使用 $_SESSION 来存储用户信息。Auth 组件已经在处理所有事情。您可以通过调用来获取控制器中的用户 ID,$this->Auth->user('id');我认为使用该变量可能会解决您的问题。

在此处查看 API 文档:http: //api.cakephp.org/2.3/class-AuthComponent.html#method-AuthComponentuser

于 2013-03-18T00:53:36.017 回答