Symfony: постоянные ссылки (скрыть идентификатор в URL)

Я прочитал абзац о постоянных ссылках (скрыть первичные ключи и заменить их значимыми строками), но я не могу понять, как работает этот код:

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()? у вас есть пример, где я могу понять, как это написать?

Большое спасибо


person satboy78    schedule 26.04.2012    source источник


Ответы (2)


В Doctrine у ​​вас есть расширение под названием «Sluggable», которое вы можете использовать.

Чтобы заставить его работать, вам нужно изменить ваш schema.yml и добавить расширение «Sluggable»:

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

Настройте DoctrineRoute в файле routing.yml.

# 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
}

Не забудьте запустить доктрину: сборка, чтобы воссоздать базу данных после изменения схемы.

person ilanco    schedule 26.04.2012
comment
@ilanco, вы можете удалить проверку с помощью forward404Unless, так как $this->getRoute()->getObject() уже выполняет проверку. - person j0k; 27.04.2012
comment
Привет, я пробовал... Это вызвало у меня некоторые проблемы, но я решил их (в ответе я объясню, как я это сделал...) - person satboy78; 03.05.2012

теперь работает нормально!

# 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(), потому что у меня возникла ошибка при использовании вашей функции.

person satboy78    schedule 03.05.2012
comment
Хорошо, но вы можете заменить .html на .:sf_format и добавить в requiremet sf_format: html - person Haithem Rihane; 28.11.2013