在Symfony2中的实体类中添加额外的方法是一种好习惯吗?

时间:2013-07-09 08:59:12

标签: php symfony doctrine-orm

我有节点实体。在数据库中,我只有id和title,想要生成URL,我的问题是

  1. 向实体添加额外的方法是不错的做法?
  2. 可以在实体中编写教义查询吗?

    $parent = $this->em->getRepository('MyDemoBundle:Nodes')->findOneBy(array("parentId" => $this->getParentId()));
    
  3. 在实体中使用$this->getRequest()->getHost()是否可以使实体symfony依赖?

  4. 在NodeRepository类中编写getURL方法更好吗?

  5. 实体中应该包含哪些内容以及存储库类中的内容?

    class Node 
    {
        private $id;
        private $title;
    
       public function getId() 
       {
          return $this->id;
       }
    
       public function setId($id) 
       {
          $this->id = $id;
       }
    
       public function getTitle() 
       {
          return $this->title;
       }
    
      public function setTitle($title) 
      {
          $this->title = $title;
      }
    
      public function getURL ()
      {
            if ($this->getType() == "document") {
                $url = "http://".$this->getRequest()->getHost()."/research/" . preg_replace("/[-\s]+/", "-", strtolower(preg_replace("/[^-a-z0-9\s]+/i", "", trim($this->getTitle())))) . "-" . $this->getId() . "/";
            } elseif($this->getType() == "comment") {
                $parent = $this->em->getRepository('MyDemoBundle:Nodes')->findOneBy(array("parentId" => $this->getParentId()));
                if($this->getParentType() == "document"){
                    $url = "http://".$this->getRequest()->getHost()."/research/" . preg_replace("/[-\s]+/", "-", strtolower(preg_replace("/[^-a-z0-9\s]+/i", "", trim($parent->getTitle())))) . "-" . $this->getId();
                } else {
                    $url = "http://".$this->getRequest()->getHost()."/content/" . preg_replace("/[-\s]+/", "-", strtolower(preg_replace("/[^-a-z0-9\s]+/i", "", trim($parent->getTitle())))) . "-" . $this->getParentId() ;
                }
            } else {
                $url = "http://".$this->getRequest()->getHost()."/content/" . preg_replace("/[-\s]+/", "-", strtolower(preg_replace("/[^-a-z0-9\s]+/i", "", trim($this->getTitle())))) . "-" . $this->getId() . "/";
            }
        return $url;
       }
    
    }
    

2 个答案:

答案 0 :(得分:2)

这个想法很糟糕。除此之外,您无权访问实体中的请求或实体管理器。实体是POPO(普通的旧PHP对象),即仅表示数据的虚拟对象。

如果你想让父母得到一个getter,那么你应该用正确的注释/映射(OneToMany,ManyToOne,ManyToMany)来标记一个字段。请阅读documentation中的一些内容。有了它们,您无需编写任何查询。其他查询进入存储库类。

你应该在symfony中阅读一些how urls are generated。您无需引用主机。 URL主要在控制器或您需要输出的模板中生成。

顺便说一句。如果你想要网址的标题,你应该看一下学术扩展的sluggable behavior(可以用DoctrineExtensionsBundle安装)

总而言之,您应该阅读entire book以了解基础知识!

答案 1 :(得分:0)

您可能还需要了解How to create custom repository classses 这是添加"自定义方法的正确方法" symfony中的tp实体类

以下是文章的介绍:

  

在前面的部分中,您开始构建和使用更多内容   来自控制器内部的复杂查询。为了隔离,重用   并测试这些查询,创建自定义是一种很好的做法   您的实体的存储库类。包含查询逻辑的方法   然后可以存储在这个类中。

     

为此,请将存储库类名添加到实体的映射中   定义: