【发布时间】:2019-02-25 13:10:37
【问题描述】:
我想为我的 Symfony 4 应用程序使用自定义集合类。以下场景是我想要实现的一个示例:
我有一个帖子收集类,它有一些用于过滤和映射数据的实用程序。
class PostArrayCollection extends ArrayCollection implements PostCollectionInterface
{
public function mapTitles()
{
return $this->map(function (Post $post) {
return $post->getTitle();
});
}
public function filterPublishedAfterDate(DateTime $from)
{
return $this->filter(function (Post $post) use ($from) {
return $post->publishedDate() > $from;
});
}
}
也是用户类,它是一个 Doctrine 实体。
class User
{
/**
* @ORM\OneToMany(targetEntity="App\Entity\Post", mappedBy="post", cascade={"persist"})
*/
private $posts;
public function __construct()
{
$this->posts = new PostArrayCollection();
}
public function getPosts(): PostCollectionInterface
{
return $this->posts;
}
}
然后在助手或控制器中有一个方法将访问用户的数据,如下所示:
public function showPublishedPostTitlesForUser(User $user)
{
$publishedPostTitles = $user->getPosts()
->filterPublishedAfterDate(new DateTime())
->mapTitles();
// Render the titles...
}
上述方法在手动创建新对象时有效,例如在单元测试中。但是从存储库加载实体时它不起作用,因为这样集合将被Doctrine\ORM\PersistentCollection 对象填充。
我现在的问题是,如何配置我的应用,以便在加载实体时可以使用自定义持久集合(例如 PersistentPostCollection)?
我确实找到了这个页面https://www.doctrine-project.org/projects/doctrine-collections/en/latest/lazy-collections.html#lazy-collections,但我找不到如何将它集成到 Symfony 4 中。
注意:上面的场景是一个简单的例子,目的是为了让这个问题简短易懂。我知道在使用存储库获取正确数据时可以避免整个问题。但这不是我在这里寻找的。这个问题是关于理解 Symfony 4 中 Doctrine 集合的可能性。
【问题讨论】:
-
您是否尝试过使用存储库而不是扩展 ArrayCollection?例如。
$userRepository->getUserPostsFrom(User $user, DateTime $from)获取帖子“createdBy”用户和“发布”日期?可以通过单个请求完成您的操作,而不是事后过滤...
标签: php symfony doctrine-orm doctrine symfony4