所以我想说我想用
$this->generateUrl("SomeRouting_name") //this would return something like myApp/myCommentpage.html
在一个实体中。我为什么不这样做?
在实体类中可以使用哪种类型的辅助函数?功能除了
之类的功能public function getId(){
return $this->id;
}
在控制器中很多次我发现我的功能看起来很相似,我讨厌它。 E.g:
class MyController extends Controller{
public function postCommentAction($cgid = null , $pid = null){
$em = $this->getDoctrine()->getManager();
$cg = $em->getRepository('MyBundle:CommentGroup')->findOneBy(array("id" => $cgid));
$cgp = $em->getRepository('MyBundle:CommentGroupPerson')->findBy(array("comment_group_id" => $cgid, "person_id" => $pid));
if ($cg === null) //redirect...
if ($cgp === null) //redirect
//rest left out since not important
}
现在举个例子,我想知道这个CommentGroupPerson是否可以发表评论。
假设用户是系统管理员或管理员,或者其ID是7(为什么不是),该人可以。如果用户不符合这些要求,我想重定向到错误页面errorwebpc.html.twig
,并显示消息“你不会通过”
我不喜欢将所有这些业务逻辑放到控制器的所有地方。由于可能存在不同的控制器,这将违反干原理。 会有什么清洁解决方案?
最好也是,同时减少行数。如果我们用其他东西替换这里的东西,那就需要更多的线来写,那么优势就会失去了。
进一步考虑到:
我们也有一个使用相同实体的移动应用程序,但不同的错误检查,并且返回的页面应为errormobile.html.twig
,并显示错误消息“对不起亲爱的用户,您无法通过”
答案 0 :(得分:1)
Doctrine Entities应该是普通的旧php对象,并且应该只包含数据以及getter / setter。因此,您可能不应该在其中实现业务逻辑(尽管您可能)。您的示例存在问题
$this->generateUrl("SomeRouting_name");
是,您需要将必要的对象注入实体或从控制器传递它们。没有人阻止你这样做,但你的实体将紧密耦合到调用代码。 (我不确定,如果可以使用Symfony的Dependency Inection向实体注入内容)。
“正确”解决方案(或至少其中一个)是使用服务。如果你谷歌“在symfony中放置业务逻辑的地方”,大多数回复都是指使用服务。您可以创建任意数量的服务并注入所需的一切(实体管理器,路由服务等)。使用这种方法,您可以减少控制器中的重复代码,并在服务中包含所有规则和逻辑。
除此之外,Symfony和Doctrine提供了创建侦听器和订阅者的可能性,这可能适用于某些场景。
答案 1 :(得分:0)
将存储库用于业务逻辑。
另外,在你的实体课程中,你实际上是在写所有的getter& setter方法?你可能会得到一个很长的代码。
我的解决方案:
/**
* Constructor for the class.
*
*/
public function __construct()
{
// Initialise your variables, for example you can generate the UID, or the date
//$this->createdAt = new \DateTime();
}
/**
* Get value for data '$name'
* @param string $name
* @return Type of data '$name'
*/
public function __get($name)
{
return $this->$name;
}
/**
* Set value for data '$name'
* @param string $name
* @param generic $value
* @return Type of data '$name'
*/
public function __set($name, $value)
{
$this->$name = $value;
return $this;
}
public function offsetGet($name)
{
return $this->$name;
}