使用存储库方法为实体定义__toString()

时间:2019-04-24 10:06:41

标签: symfony

比方说,我有一个“书”实体类。它链接到“作者”实体类。在我的书库中,我有一个名为getTitle()的方法,用于将书中的信息和author属性连接起来。

现在,我希望从任何视图中获取该信息,当我调用{{thisBook}}时,将显示getTitle()结果。

本能地,我想这将需要在我的书本实体中创建一个__toString()方法,该方法调用我的书库的getTitle()方法。但是每个人都建议不要这样做(请参阅:Call repository method from entityHow to access repository methods for an entity in symfony2? ...)。

我应该“强制”系统吗?还是有一种更清洁的方法?这听起来很琐碎,必须有一种“官方”的简单方法来做到这一点……

2 个答案:

答案 0 :(得分:1)

如果不包含对外部资源的访问,则在实体本身中定义方法没有问题。因此,如果您要做的只是从实体本身连接值,那么就没问题(关于anemicrich实体的Google)。

在这种情况下,使用类似服务之类的东西绝对是过大的。基本上,您不应该访问实体中的服务(以及存储库或其他任何实际能起作用的东西),它们只是存储。但是访问实体本身的值甚至是相关实体的值都很好。

答案 1 :(得分:0)

创建类似src/Service/SetupHelper.php的服务:

<?php


namespace App\Service;

use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;

class SetupHelper
{
    private $em;
    private $session;

    public function __construct(EntityManagerInterface $em, SessionInterface $session)
    {
        $this->em = $em;
        $this->session = $session;
    }

    public function getName(){
        return $this->getUser()->getName();
    }

    }
}

定制服务后,您可以像这样在任何树枝中调用函数:

<title>{% block title %}{{ SetupHelper.getName() }}!{% endblock %}</title><title>{% block title %}{{ SetupHelper.getName() }}!{% endblock %}</title>