通常可以将任何域对象放入会话($ GLOBALS ['TSFE']-> fe_user)中,因为它们会自动正确地序列化和反序列化。但是在某些情况下,此操作将失败(我想是由于循环引用或序列化数据超出了数据库blob字段的限制)。
我找到了一种更好的方法,在序列化时将域对象转换为整数“ ids”,并在反序列化时从存储库中获取真实的域对象:
class PutMeIntoSession implements \Serializable {
protected $project = null;
public function getProject() {
return $this->project;
}
public function setProject(\Vendor\Ext\Domain\Model\Project $project = NULL) {
$this->project = $project;
}
public function serialize() {
$serialized = serialize(array(
'project' => $this->project ? $this->project->getUid() : 0
));
return $serialized;
}
public function unserialize($serialized) {
$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
$unserialized = unserialize($serialized);
$this->project = $objectManager->get(ProjectRepository::class)->findByUid($unserialized['project']);
}
}
这似乎很好。但是我不知道是否有更聪明的方法来实现这一目标,或者我的方法是否可能存在问题?