0

我已经阅读了有关永久链接的段落(隐藏主键并用重要的字符串替换它们),但我不明白这段代码是如何工作的:

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() 函数吗?你有一个我可以理解如何写的例子吗?

非常感谢

4

2 回答 2

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
}

更改架构后,不要忘记运行学说:构建以重新创建数据库。

于 2012-04-26T19:51:22.090 回答
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(),因为我在使用您的函数时出错

于 2012-05-03T08:31:43.517 回答