Entities in the Session
There are several use-cases to save entities in the session, for example:
- User data
- Multi-step forms
To achieve this with Doctrine you have to pay attention to some details to get this working.
Updating an entity
In Doctrine an entity objects has to be "managed" by an EntityManager to be updatable. Entities saved into the session are not managed in the next request anymore. This means that you have to update the entities with the stored session data after you fetch the entities from the EntityManager again.
For a representative User object the code to get data from the session into a managed Doctrine object can look like these examples:
Working with scalars
In simpler applications there is no need to work with objects in sessions and you can use separate session elements.
1 <?php
require_once 'bootstrap.php';
session_start();
if (isset($_SESSION['userId']) && is_int($_SESSION['userId'])) {
$userId = $_SESSION['userId'];
$em = GetEntityManager(); // creates an EntityManager
$user = $em->find(User::class, $userId);
$user->setValue($_SESSION['storedValue']);
$em->flush();
}
2
3
4
5
6
7
8
9
10
11
12
13
14
Working with custom data transfer objects
If objects are needed, we discourage the storage of entity objects in the session. It's preferable to use a DTO (data transfer object) instead and merge the DTO data later with the entity.
1 <?php
require_once 'bootstrap.php';
session_start();
if (isset($_SESSION['user']) && $_SESSION['user'] instanceof UserDto) {
$userDto = $_SESSION['user'];
$em = GetEntityManager(); // creates an EntityManager
$userEntity = $em->find(User::class, $userDto->getId());
$userEntity->populateFromDto($userDto);
$em->flush();
}
2
3
4
5
6
7
8
9
10
11
12
13
14
Serializing entity into the session
Entities that are serialized into the session normally contain references to other entities as well. Think of the user entity has a reference to their articles, groups, photos or many other different entities. If you serialize this object into the session then you don't want to serialize the related entities as well. This is why you shouldn't serialize an entity and use only the needed values of it. This can happen with the help of a DTO.
1 <?php
require_once 'bootstrap.php';
$em = GetEntityManager(); // creates an EntityManager
$user = $em->find("User", 1);
$userDto = new UserDto($user->getId(), $user->getFirstName(), $user->getLastName());
// or "UserDto::createFrom($user);", but don't store an entity in a property. Only its values without relations.
$_SESSION['user'] = $userDto;
2
3
4
5
6
7
8
9
10