【问题标题】:Symfony, where to put custom methods on entities?Symfony,在哪里将自定义方法放在实体上?
【发布时间】:2016-06-10 07:01:39
【问题描述】:

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

例如,如果我有一个实体Order,那么将$order->complete() 放在哪里?还是$order->sendToProduction()$order->queueForDelivery()

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

在控制器中?

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

在实体中?

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

在实体控制器中?

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

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

【问题讨论】:

  • "这将是 MVC 模型中更合适的方式,但在这里我找不到从 Entity 类内部执行自定义 mysql 查询(doctrine/em 不可用)的简单方法,我觉得很奇怪,因为数据库操作应该在实体级别执行,我相信“不,实体(或模型)应该与您的存储引擎完全分离。实际上,他们应该与其他任何事物脱钩,并且应该能够单独生活。

标签: php symfony


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    相关资源
    最近更新 更多