Doctrine2定制的独特性

时间:2012-07-27 16:55:15

标签: symfony doctrine-orm unique slug

我正在尝试为名为Page的实体创建唯一的url slug。 slu are应该只是与网站相关的页面唯一。

因此页面{site1.com/about,site2.com/about}的url slugs足以识别页面。在所有网站上拥有唯一的网页将没有吸引力:site3.com/about-21很奇怪。

我尝试使用DoctrineExtensions缓慢执行此操作,但得到了to write自定义的建议。以下是我的第一次尝试。因为我无法在Entity中获取EntityManager,所以我很难找到其他slu to来检查它们是否是唯一的。

有什么建议吗?

/** 
 * Slugify Title.  To "re-slugify", set titleSlug to empty
 * @ORM\PrePersist
 */
public function slugifyTitle($override = false) {
  // We only slugify is titleSlug is empty
  if (empty($this->titleSlug) or $override) {

    if (!empty($this->title)) {
      // Title not empty?  slugify the title.  SluggableListener line 220
      $slug = Urlizer::transliterate($this->title);
    } else {
      // Title empty?  make a slug based on the classname
      $slug = get_class($this);
    }
    $this->titleSlug = Urlizer::urlize($slug);  
    $this->titleSlug = $this->uniqueify($this->titleSlug);
    echo $this->titleSlug;
  };
}

/**
 * Make the string unique in the domain of:  This site, this pagetype
 */
public function uniqueify($someSlug) {
  //return $someSlug . rand();
  // FIXME :-)
  $em = $this->get('doctrine')->getEntityManager();
  $pageType = get_class($this);
  $query = $em->createQuery("SELECT slug FROM Powma\ServiceBundle\Entity\$pageType pt");
  $slugs = $query->getResult();
  // find a unique one.
}

1 个答案:

答案 0 :(得分:0)

作为参考,解决方案是创建一个事件监听器,如下所述:

http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html