Обычно можно поместить любой объект домена в сессию ($ GLOBALS ['TSFE'] -> fe_user), поскольку они автоматически сериализуются и десериализуются правильно. Но в некоторых случаях это терпит неудачу (я полагаю, что вызванные круговыми ссылками или сериализованными данными превышает предел поля BLOB-объекта базы данных).
Я нашел лучший подход, преобразовывая доменные объекты в целочисленные «идентификаторы» при сериализации. и получение реальных доменных объектов из репозитория при десериализации:
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']);
}
}
Кажется, это работает нормально. Но я не знаю, есть ли более разумные способы добиться этого или есть какие-то возможные проблемы с моим подходом?