什么属于实体类,什么不属于,为什么不属于实体类?

时间:2014-05-26 23:57:28

标签: symfony design-patterns doctrine-orm doctrine

所以我想说我想用

$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,并显示错误消息“对不起亲爱的用户,您无法通过”

2 个答案:

答案 0 :(得分:1)

Doctrine Entities应该是普通的旧php对象,并且应该只包含数据以及getter / setter。因此,您可能不应该在其中实现业务逻辑(尽管您可能)。您的示例存在问题

$this->generateUrl("SomeRouting_name");

是,您需要将必要的对象注入实体或从控制器传递它们。没有人阻止你这样做,但你的实体将紧密耦合到调用代码。 (我不确定,如果可以使用Symfony的Dependency Inection向实体注入内容)。

“正确”解决方案(或至少其中一个)是使用服务。如果你谷歌“在symfony中放置业务逻辑的地方”,大多数回复都是指使用服务。您可以创建任意数量的服务并注入所需的一切(实体管理器,路由服务等)。使用这种方法,您可以减少控制器中的重复代码,并在服务中包含所有规则和逻辑。

请参阅Symfony Service Container

除此之外,Symfony和Doctrine提供了创建侦听器和订阅者的可能性,这可能适用于某些场景。

请参阅Doctrine Event ListenersSymfony Event Listener

答案 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;
}