symfony:永久链接(在网址中隐藏ID)

时间:2012-04-26 19:36:22

标签: symfony1 doctrine permalinks

我已经阅读了关于永久链接的段落(隐藏主键并用重要字符串替换它们)但我无法理解它是如何工作的代码:

public function executePermalink($request)
  {
    $article = ArticlePeer::retrieveBySlug($request->getParameter('slug');
    $this->forward404Unless($article);  // Display 404 if no article matches slug
    $this->article = $article;          // Pass the object to the template
  }

这段代码是典型的推进,是不是?教义有类似的东西吗?我要编写retrieveBySlug()函数?你有一个例子,我可以理解如何写它吗?

非常感谢

2 个答案:

答案 0 :(得分:1)

在Doctrine中,您可以使用名为“Sluggable”的扩展程序。

要使其正常工作,您必须更改schema.yml并添加“Sluggable”扩展名:

# config/doctrine/schema.yml
Article:
  actAs:
    Timestampable: ~
    Sluggable:
      fields: [name]
  columns:
    name:
      type: string(255)
      notnull:  true

在routing.yml中设置DoctrineRoute

# apps/frontend/config/routing.yml
category:
  url:      /article/:slug
  class:    sfDoctrineRoute
  param:    { module: article, action: show }
  options:  { model: Article, type: object }

然后在您的行动代码中,您可以执行以下操作:

public function executeShow(sfWebRequest $request)
{
    $this->article = $this->getRoute()->getObject();
    $this->forward404Unless($article);  // Display 404 if no article matches slug
    $this->article = $article;          // Pass the object to the template
}

不要忘记运行一个doctrine:build以在更改模式后重新创建数据库。

答案 1 :(得分:0)

现在工作正常!

# apps/frontend/config/routing.yml
opera_slug:
  url:   /:sf_culture/opere/:operaslug.html
  class:    sfDoctrineRoute
  param: { module: opera, action: permalink }
  options:  { model: Opera, type: object }
  requirements:
    sf_culture: (?:it|en|es|fr)



  public function executePermalink(sfWebRequest $request)
  {  
    $this->opera = $this->getRoute()->getObject();
    $this->forward404Unless($this->opera);  // Display 404 if no article matches slug
    //$this->opera = $opera;          // Pass the object to the template  
  }  

正如你所看到的,我修改了最后两行executePermalink(),因为我使用你的函数时出错了