比方说,我有一个“书”实体类。它链接到“作者”实体类。在我的书库中,我有一个名为getTitle()
的方法,用于将书中的信息和author属性连接起来。
现在,我希望从任何视图中获取该信息,当我调用{{thisBook}}
时,将显示getTitle()结果。
本能地,我想这将需要在我的书本实体中创建一个__toString()
方法,该方法调用我的书库的getTitle()方法。但是每个人都建议不要这样做(请参阅:Call repository method from entity,How to access repository methods for an entity in symfony2? ...)。
我应该“强制”系统吗?还是有一种更清洁的方法?这听起来很琐碎,必须有一种“官方”的简单方法来做到这一点……
答案 0 :(得分:1)
如果不包含对外部资源的访问,则在实体本身中定义方法没有问题。因此,如果您要做的只是从实体本身连接值,那么就没问题(关于anemic
和rich
实体的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>