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



假设我有一个"book"实体类。它链接到"作者"实体类。在我的图书存储库中,我有一个名为 getTitle() 的方法,它连接了来自书籍的信息和作者属性。

现在,我希望从我的任何视图中,当我调用 {{thisBook}} 时,会显示 getTitle(( 结果。

本能地,我想它需要在我的书籍实体中创建一种__toString()方法,该方法调用我的书籍存储库的 getTitle(( 方法。但是每个人都建议不要这样做(请参阅:从实体调用存储库方法,如何在symfony2中访问实体的存储库方法?

我应该"强制"系统吗?还是有更清洁的方法?这听起来很微不足道,一定有一个"官方"和简单的方法......

如果实体

本身不包括对外部资源的访问权限,则在实体本身中定义方法没有问题。因此,如果您所做的只是连接来自实体本身的值,那就没有问题了(谷歌搜索所谓的anemicrich实体(。

在这种情况下,使用服务之类的东西绝对是矫枉过正的。基本上,您不应该访问实体中的服务(以及存储库或其他任何实际执行某些工作的东西(,它们只是一个存储。但是访问实体本身的值甚至相关实体的值都可以。

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

<?php

namespace AppService;
use AppEntityUser;
use DoctrineORMEntityManagerInterface;
use SymfonyComponentHttpFoundationSessionSessionInterface;
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>

最新更新