我有节点实体。在数据库中,我只有id和title,想要生成URL,我的问题是
可以在实体中编写教义查询吗?
$parent = $this->em->getRepository('MyDemoBundle:Nodes')->findOneBy(array("parentId" => $this->getParentId()));
在实体中使用$this->getRequest()->getHost()
是否可以使实体symfony依赖?
在NodeRepository类中编写getURL方法更好吗?
实体中应该包含哪些内容以及存储库类中的内容?
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;
}
}
答案 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实体类
以下是文章的介绍:
在前面的部分中,您开始构建和使用更多内容 来自控制器内部的复杂查询。为了隔离,重用 并测试这些查询,创建自定义是一种很好的做法 您的实体的存储库类。包含查询逻辑的方法 然后可以存储在这个类中。
为此,请将存储库类名添加到实体的映射中 定义: