Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 什么属于实体类,什么不属于实体类,为什么不属于实体类,以及如何解决实体类?_Symfony_Design Patterns_Doctrine Orm_Doctrine - Fatal编程技术网

Symfony 什么属于实体类,什么不属于实体类,为什么不属于实体类,以及如何解决实体类?

Symfony 什么属于实体类,什么不属于实体类,为什么不属于实体类,以及如何解决实体类?,symfony,design-patterns,doctrine-orm,doctrine,Symfony,Design Patterns,Doctrine Orm,Doctrine,假设我想使用 $this->generateUrl(“SomeRouting_name”)//这将返回类似于myApp/myCommentpage.html的内容 在一个实体中。为什么我不应该这样做 在实体类中可以使用哪种类型的辅助函数?除了像 public function getId(){ return $this->id; } 很多时候,在控制器中,我发现我的功能看起来很相似,我讨厌这样。例如: class MyController extends Controller{ pu

假设我想使用

$this->generateUrl(“SomeRouting_name”)//这将返回类似于myApp/myCommentpage.html的内容

在一个实体中。为什么我不应该这样做

在实体类中可以使用哪种类型的辅助函数?除了像

public function getId(){
  return $this->id;
}
很多时候,在控制器中,我发现我的功能看起来很相似,我讨厌这样。例如:

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
,并显示消息“您将不会通过”

我不喜欢把所有这些业务逻辑都放在控制器上。由于可以有不同的控制器,这将违反dry原则会有什么干净的溶液?

最好也是这样,同时减少行数。如果我们用其他东西替换这里的东西,需要更多的行来写,那么优势就失去了

进一步考虑到:
我们还有一个使用相同实体、不同错误检查的移动应用程序,返回的页面应该是
errormobile.html.twig
,错误消息为“对不起,亲爱的用户,您不能通过”

使用存储库进行业务逻辑

另外,在实体类中,您是否真的编写了所有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;
}

条令实体应该是普通的旧php对象,并且应该只包含数据和getter/setter。因此,您可能不应该在它们内部实现您的业务逻辑(尽管您可能可以)。你的例子有什么问题

$this->generateUrl("SomeRouting_name");
也就是说,您需要将必要的对象注入实体或从控制器传递它们。没有人阻止您这样做,但是您的实体将与调用代码紧密耦合。(我不确定是否可以使用Symfony的Dependency InAction将某些内容注入实体)

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

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


请参见和

您的解决方案是存储库类吗?我用ideKinda生成getter和setter,因为Symfony2本身不是一个MVC框架,因为它实际上并不严格尊重设计模式的模型部分,所以我在存储库中创建所有复杂查询,并创建用作模型的服务。关于ide生成的内容,如果您在体系结构中做了一些重大更改,那么维护起来可能会非常麻烦;因此,我还要做的是删除所有生成的getter和setter,以便将这些神奇的函数放在我所有的项目中都运行得非常好。