Symfony2 : best approach to use business (repository) logic in entity or controller

标签 symfony doctrine-orm repository entity business-logic

我的项目中遇到一个设计问题,与放置一些业务逻辑的位置有关。

我有三个实体:Event、TicketOrder 和 Ticket。一项事件有很多 TicketOrder,一项 TicketOrder 也有很多 Ticket。

在我的模板中,我必须显示事件有多少张门票。我一直在思考实现这一目标的最佳方法,但没有找到好的解决方案。我试过这个:

1) 在Event实体中创建一个私有(private)成员'ticketsCount',使用setTicketsCount和getTicketsCount方法。使用 LifeCycleCallback“PostLoad”创建“loadTicketsCount”方法,以访问 TicketRepository 方法“findByEvent”。这是不可能的,因为我无法访问实体类中的存储库。

2) 在将用于显示事件的操作中,我可以访问票证存储库并手动设置事件“ticketsCount”属性。我不知道这是否是一个好方法,因为如果我的操作列出了很多事件,我将不得不循环所有事件并对每个事件进行存储库调用。

我真的不知道实现这一目标的最佳方法,如果有人可以帮助我,我将非常感激。

谢谢! ;)

最佳答案

当您使用学说实体存储库的 findAll、findBy 或 findBy* 方法时,会返回一个包含实体对象的简单 php 数组。

数组类实现了 countable 接口(interface)。因此使用 Twig 长度过滤器

{{ ticketOrder.tickets|length }}

您对数组执行一个简单的 php count()

实际上,现在执行计数查询是有意义的,因为内存中已经有了结果。因此,计算结果并从内存中检索它似乎更有效,因为当您访问关联时,它们会完全加载到内存中。

<小时/>

然而,实体之间的关联可能会变得相当大。因此,想象一下您与数十万个实体有关联。您不会将这些实体全部加载在一起并始终保留在内存中。因此,在 Doctrine 2.1 中,您可以将关联注释为 Extra Lazy。如果您在您的情况下这样做,则在调用上述 Twig 过滤器时将执行计数查询。但结果不会保存在内存中。

http://docs.doctrine-project.org/en/2.0.x/tutorials/extra-lazy-associations.html

<小时/>

根据您的最新评论:

我可以想象一种方法来做到这一点。在模板中,您可以使用渲染语句调用 Controller 的操作,例如

{% render YourMainBundle:getTickets with { 'event_id' : event.id } %}

在此操作中,您可以调用一个查询来查找与特定事件关联的所有门票。此操作必须返回 html,例如充满数据的模板。

关于Symfony2 : best approach to use business (repository) logic in entity or controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15101087/

相关文章:

php - 您将如何测试一个可以向查询添加数十个不同过滤器的类?

c# - 哪个更好?在存储库或域级服务(通过 IQueryable 或其他)中有复杂的搜索逻辑吗?

variables - OBIEE 存储库变量和 session 变量之间的区别

php - Symfony进程中的docker-machine

php - 添加不受 Sonata Admin Bundle 管理的实体

doctrine-orm - Doctrine DBAL 查询生成器省略了一些连接

symfony - 解决关于 $this 的弃用 - get ('twig' )-> getextension ('form' )

php - Doctrine 从数据库中选择不带小数位的浮点值

symfony - 使用 Doctrine 设置数据库连接超时

intellij-idea - IntelliJ中的Gradlebuild设置