【问题标题】:unique slugs with multi entities in symfony2symfony2 中具有多个实体的独特蛞蝓
【发布时间】:2012-06-13 15:52:18
【问题描述】:

我有一个小型 symfony2 应用程序,用户可以在其中创建页面。每个页面都应该可以通过路由 /{user_slug}/{page_slug} 访问。我有实体用户和页面,我对这两个实体都使用了 sluggable 行为。为了找到正确的页面,user_slug 和 page_slug 的组合必须是唯一的。

检查 user_slug 和 page_slug 的组合是否唯一的最佳方法是什么?

【问题讨论】:

  • 我不明白你想要什么。什么时候验证 user_slug 和 page_slug 的唯一性?
  • 如果用户创建页面,我想检查 slugs

标签: symfony slug


【解决方案1】:

在将实体持久化到服务层之前,请检查给定的用户和页面 slug 组合是否唯一,如果不修改页面 slug(附加 -2 或类似的东西)或抛出异常:

public function persistPage(Page $page) {
    $userSlug = $page->getUser()->getSlug();
    $pageSlug = $page->getSlug();

    if ($this->pagesRepository->findOneBySlugs($userSlug, $pageSlug) != null) {
        // given combination already exists
        throw new NonUniqueNameException(..);
        // or modify the slug
        $page->setSlug($page->getSlug() . '-2');
        return $this->persistPage($page);
    }

    return $this->em->persist($page);
}

// PagesRepository::findOneBySlugs($userSlug, $pageSlug)
public function findOneBySlugs($userSlug, $pageSlug) {
    $query = $this->em->createQueryBuilder('p')
            ->addSelect('u')
            ->join('p.user', 'u')
            ->where('p.slug = :pageSlug')
            ->where('u.slug = :userSlug;)
            ->getQuery();

    $query->setParameters(combine('userSlug', 'pageSlug'));

    return $query->getSingleResult();
}

【讨论】:

    【解决方案2】:

    在你的存储库中试试这个:

    public function findByUsernameAndSlug($username, $slug)
    {
        $em = $this->getEntityManager();
        $query = $em->createQuery("
            SELECT g
            FROM Acme\PagesBundle\Entity\Page p
            JOIN p.owner u
            WHERE u.username = :username
            AND p.slug = :slug
        ")
                ->setParameter('username', $username)
                ->setParameter('slug', $slug);
    
        foreach ($query->getResult() as $goal) {
            return $goal;
        }
    
        return null;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 2012-12-25
      • 2021-03-10
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 2019-02-21
      相关资源
      最近更新 更多