我已经阅读了关于永久链接的段落(隐藏主键并用重要字符串替换它们)但我无法理解它是如何工作的代码:
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()函数?你有一个例子,我可以理解如何写它吗?
非常感谢
答案 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(),因为我使用你的函数时出错了