по lazy load. Есть 3 способа:
1. Сделать стандартный lazy в сущности.
Код: Выделить всё
public function getPosts()
{
if($this->posts === null) {
$this->posts = $this->postRepository->findForUser($this->id);
}
return $this->posts;
вариант плохой - хранилище протекает в доменный слой.
2. Прокси
Код: Выделить всё
class UserProxy extends User
{
public function getPosts()
{
$posts = parent::getPosts();
if($posts === null) {
$posts = $this->postRepository->findForUser($this->id);
$this->setPosts($posts);
}
return $posts;
}
}
Плюсы: успешный instanceOf User
Минусы: нельзя заэкстендить final class User, а я люблю final.
2.1. а) генерировать прокси автоматически б) инджектить в $this->posts через рефлексию
Плюсы: не нужен сеттер
Минусы: видимо тот же, что и в п.2
3. Domain Dependency Resolver
В месте, где будут обрабатываться связанные модели, ресолвить их.
Код: Выделить всё
$this->userDependencyResolver->resolve($user, ['posts']);
$posts = $user->getPosts();
Код: Выделить всё
public function resolve($entity, array $strategies)
{
foreach ($strategies as $strategy) {
$this->resolveStrategy($entity, $strategy);
}
}
private function resolveStrategy($entity, $strategy)
{
switch $strategy {
case 'posts' :
$this->resolvePosts($entity);
break;
}
}
private function resolvePosts($entity)
{
$posts = $entity->getPosts();
if($posts === null) {
$posts = $this->postRepository->findForUser($entity->id);
$entity->setPosts($posts);
}
}
плюс: самый лучший вариант
минус: нет магии, нужно вручную ресолвить, но в Application-слое, поэтому вроде и ок.