将用户会话数据存储到自定义数据库中

时间:2009-03-09 07:59:28

标签: symfony1

通过更改factories.yml:

中的设置,可以在数据库中store user session
all:
  storage:
    class: sfMySQLSessionStorage
    param:
      db_table:    session              # Name of the table storing the sessions
      database:    propel               # Name of the database connection to use
      # Optional parameters
      db_id_col:   sess_id              # Name of the column storing the session id
      db_data_col: sess_data            # Name of the column storing the session data
      db_time_col: sess_time            # Name of the column storing the session timestamp

从给出的示例中,似乎表中的列仅限于几个预定义的列。这意味着无法存储Symfony未预料到的其他信息,例如ip地址。

是否可以扩展数据库架构以包含更多自定义列?

2 个答案:

答案 0 :(得分:2)

您可以像这样创建自己的会话类

class myPDOSessionStorage extends sfPDOSessionStorage {
    /**
    * Extending session write function
    *
    * @param string $id Session identifier  
    * @param mixed $data Session's data
    */
    public function sessionWrite($id, $data){
        /*
          Handle your specific data, e.g. :
        */
        $mySession = new MySession();
        $mySession->setIp($_SERVER['REMOTE_IP']);
        // connect with org. session
        $mySession->setSessionId($id);
        // Save extended session - you for sure need to add logic in finding existing one's
        $mySession->save();

        // IMPORTANT Call Parent function to update original session data
        parent::sessionWrite($id, $data);
    }
}

在factories.yml:

all:
  storage:
    class: myPDOSessionStorage
    db_table:    my_session # Name of the table storing the sessions
    database:    my_session # Database connection to use

这是一个基本的例子,所以你可以在这里找到更多信息:

答案 1 :(得分:0)

不直接;虽然您可以在会话中存储相当多的数据,但会话的结构非常有限。 Symfony只将会话数据存储为db中的blob。您可以尝试修改sfMySQLSessionStorage类,以便在您真正需要时在会话表中包含$ _SERVER ['REMOTE_IP']。