Once the user is logged in,the entire User object is serialized into
the session. On the next request,the User object is deserialized.
Then,value of the id property is used to re-query for a fresh User
object from the database.
和,
… in practice,this means that the User object is reloaded from the
database on each request using the id from the serialized object.
为什么Symfony有必要从每个请求的数据库中获取User对象?
存储在会话数据中的序列化用户对象在什么情况下与从数据库提取的用户对象不匹配?当然,Symfony知道用户对象何时发生变化,并且可以在这种情况下简单地更新会话数据?
PHP会话通常不受外部操作 – 它们只是文件或内存存储中的一系列数据.改变一个的唯一方法是反序列化,改变和保留整个事情 – 这通常只有在你进入该会话时才会完成.
因此,如果用户的详细信息在登录会话之外更改,则序列化的Blob将保持不合时宜.这将是一个特殊的问题,例如,如果管理员撤销了用户的访问权限.
诸如memcached的缓存可能会存储每个用户的详细信息,并在编辑时明确刷新/更改,但这将被视为数据库提取的一部分(memcached层作为更快地访问数据库数据),而不是会话处理.
正如haltabush在评论中提到的那样:如果用户在每个请求中被提取,为什么要序列化它呢?
答案是足够的信息需要存储在会话中,以确定哪个用户登录,并在下一页的加载中获取它们的全部细节.这可以像存储用户ID一样简单,但是通过使用Serializable接口,Symfony可以将其放在特定实现中,以确定哪些字段应该保存到会话中,哪些字段应该被重新获取反序列化.
它还打开了一个实现选项,将用户的所有细节保存到会话中,并以更轻松的方式“刷新”,例如.经过一定的时间或数量的请求,如this related question所讨论的.