Symfony,在实体上放置自定义方法的地方?

时间:2016-06-10 07:01:40

标签: php symfony

我正在学习Symfony,而我正试图找出将自定义操作放在实体上的位置...

例如,如果我有一个实体Order,那么放置$order->complete()的位置?或$order->sendToProduction()$order->queueForDelivery()

这些只是示例,我有复杂的实体,我必须对它们执行许多操作。

在控制器中?

  • 不,因为可以从不同的控制器调用相同的操作

在实体中?

  • 这将是MVC模型中更合适的方式,但在这里我找不到从Entity类内部执行自定义mysql查询(doctrine / em不可用)的简单方法,我觉得这很奇怪由于db操作应该在实体级别进行,我相信......

在EntityController中?

  • 它似乎不合适,例如,从侦听器调用存储库方法并不容易,并直接在对象上调用它们......

还有什么?我必须创建服务吗?实用类?

1 个答案:

答案 0 :(得分:7)

如果工作可以在一个信号实体(当然还有它的关系)内完成,那么它应该放在那里。我的意思是,如果操作是关于改变实体的内部状态。

否则,如果这个工作需要使用数据库等应用程序的其他部分,或者是在多个不相关的实体上执行,那么我建议使用services

那是什么。服务基本上是一个可以做任何事情的类。使用Service容器,您可以将任何依赖项传递给它,因此它非常灵活且易于使用。

例如$order->queueForDelivery()。这可能意味着一些不同的事情:

  • 将内部状态更改为status更改为queued_for_delivery - 然后它应该在Order实体类
  • $order应该放在其他实体类的Queue中,然后它应该在Queue类中$queue->addOrder($order)
  • 此队列是RabbitMQ之类的外部服务或其他任何内容。然后你应该使用服务类。