我的情况如下:我开发了一个应用程序,我正在尝试重构。我基本上在控制器内部找到了太多的逻辑。
我希望能够在实体内执行一些计算。
例如,有一个名为Agent的实体,它与名为Account的实体相关,该实体与Transaction实体相关。
有一次,我希望得到与代理相关的所有账户中的所有交易的总和(在特定日期范围内)。
截至目前,我能够将代码重构到代理存储库中,创建一个方法,如:
AgentRepository::getTransactionSum(Agent $agent, \DateTimeImmutable $dateFrom, \DateTimeImmutable $dateTo)
它工作正常,它比方法在控制器内部的旧版本更好,但我希望能够直接向代理提出这个问题,例如:
Agent::getTransactionSum(\DateTimeImmutable $dateFrom, \DateTimeImmutable $dateTo)
我想过使用类似的东西:
Agent::getTransactionSum(\DateTimeImmutable $dateFrom, \DateTimeImmutable $dateTo) {
return $this->getRepository()->getTransactionSum( $this, $dateFrom, $dateTo );
}
但是我在这里读到其他问题,这不是特别实用也不可取,所以...我应该如何构建这段代码呢?
由于
编辑:
可以做的一件事是让Agent类在没有任何额外SQL的情况下解析它。类似的东西:
Agent::getTransactionSum(\DateTimeImmutable $dateFrom, \DateTimeImmutable $dateTo)
{
return array_sum(
array_map(
array_filter(
$this->getTransactions(), function ( Transaction $t, $dateFrom, $dateTo ) {
return $t->getDate() >= $dateFrom && $t->getDate() <= $dateTo;
} ), function( Transaction $t ) {
return $t->getAmount();
} )
}
我想从OOP的角度来看,这会产生更纯粹的实现......虽然效率可能会低得多......
答案 0 :(得分:0)
通过&#34;将存储库绑定到实体&#34;我的意思是:
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="account")
* @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\AccountRepository")
*/
class Account
{
}
通过这种方式,您可以在存储库中拥有所有自定义函数,并使实体保持尽可能干净,这意味着:属性,设置器和getter。
仍然没有看到为什么要在实体内部进行自定义查询,这就是存储库的用途。你想做的并不意味着更好的OOP。
更多信息: