【问题标题】:Accessing Session in Model访问模型中的会话
【发布时间】:2012-01-04 21:09:37
【问题描述】:

有没有办法访问AppModel 类中的当前会话?
我想将当前登录用户的 ID 保存到几乎每个 INSERT/UPDATE 操作中。

【问题讨论】:

    标签: session cakephp model cakephp-2.0


    【解决方案1】:

    在这里找到适用于 CakePHP 2 的有效解决方案:Reading a session variable inside a behavior in cakephp 2

    这是我的 AppModel:

    <?php
    class AppModel extends Model {
    
        public function beforeSave() {
            parent::beforeSave();
    
            if (isset($this->_schema['user_id'])) {
    
                // INSERT
                if (!strlen($this->id)) {
    
                    App::uses('CakeSession', 'Model/Datasource');
                    $user_id = CakeSession::read('Auth.User.id');
    
                    $this->data[$this->alias]['user_id'] = $user_id;
    
                // UPDATE, don't change the user_id of the original creator.
                } else {
                    unset($this->data[$this->alias]['user_id']);
                }
            }
            return true;
        } 
    }
    

    【讨论】:

    • 根据我的第三个选项,仅仅因为你可以并不意味着你应该。
    • 我只是从 $this-&gt;Session-&gt;write('Auth.User.jwt', $jwt); 转到 CakeSession::write('Auth.User.jwt', $jwt); 以使我的代码从控制器运行到模型。
    【解决方案2】:

    在 CakePHP 2.x 中,您可以静态使用 AuthComponent 并在模型中获取登录用户的 ID,如下所示:

    $userId = AuthComponent::user('id');
    

    【讨论】:

      【解决方案3】:

      如果您从控制器调用保存,您可以在保存之前将会话数据包含在分配给模型的数据中:

      $data['ModelName']['session_id'] = $this->Session->id;
      $this->ModelName->save($data);
      

      或者您可以在模型中创建一个变量并将 ID 存储在那里以供以后使用:

      <?php
      //in model
      class MyModel extends AppModel{
         public $session_id;
      }
      
      
      //in controller
      $this->MyModel->session_id = $this->Session->id;
      ?>
      

      如果您必须在模型中使用该组件,那么您可以加载它。我不确定这是否可行。这不是好的做法,您可能应该考虑换一种方式。

      <?php
      
      App::uses('CakeSession', 'Model/Datasource');
      
      class MyModel extends AppModel{
         public function beforeSave(){
             $this->data['session_id'] = $this->Session->id;
      
             return true;
         }
      }
      
      ?>
      

      【讨论】:

        【解决方案4】:

        对于 3.6 及更高版本,要从 Table 类访问当前会话,请使用 Cake\Http\Session

        use Cake\Http\Session;
        
        class UsersTable extends Table
        {
            /**
             * Get user from session
             *
             * @return object
             */
            public function getUser()
            {
                $id = (new Session())->read('Auth.User.id');
                $user = TableRegistry::getTableLocator()
                 ->get('Users')
                 ->findById($id)
                 ->first();
        
                return $user;
            }
        }
        

        来源:https://api.cakephp.org/3.6/class-Cake.Http.Session.html#_read

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          • 1970-01-01
          • 2011-02-03
          • 2011-05-15
          相关资源
          最近更新 更多