0

我正在尝试为名为 Page 的实体制作独特的 url slug。slug 应该只在与站点相关的页面上是唯一的。

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

我试图用 DoctrineExtensions sluggable 来做到这一点,但得到了一些自定义的建议。下面是我的第一次尝试。因为我无法在 Entity 中获取 EntityManager,所以我无法让其他 slug 检查它们是否是唯一的。

有什么建议么?

/** 
 * 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.
}
4

1 回答 1

0

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

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

于 2012-07-27T22:24:31.277 回答