我希望在我的Symfony 4应用程序中使用自定义集合类。以下情景是我尝试实现的一个例子:
我有一个文章集合类,其中包含一些过滤和映射数据的工具。
然后在帮助器或控制器中有一种方法,可以像下面这样访问用户的数据:
上述方法适用于手动创建新对象的情况,例如在单元测试中。但是,在从代码库加载实体时,它将无法正常工作,因为这时集合将填充具有
现在我的问题是,如何配置我的应用程序,以便在加载实体时使用自定义持久集合(例如
我找到了这个页面https://www.doctrine-project.org/projects/doctrine-collections/en/latest/lazy-collections.html#lazy-collections,但是我找不到如何将其集成到Symfony 4中。
注:上述场景是为了保持问题简短和易于理解而提出的一个简单示例。我知道使用存储库可以避免整个问题。但这不是我在这里寻求的答案。这个问题是关于理解在Symfony 4中使用Doctrine集合的可能性。
我有一个文章集合类,其中包含一些过滤和映射数据的工具。
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集合的可能性。
$userRepository->getUserPostsFrom(User $user, DateTime $from)
,它可以获取一个用户创建并在某个日期之后发布的帖子。这样做可以通过单个请求完成你的操作,而无需事后过滤... - rkeet