2012-02-25 4 views
2

Sf2.0, стандартный блог, например.symfony 2 маршрутизация по модели

Кодекс routing.yml:

DevBlogBundle_post_show: 
pattern: /posts/{id} 
defaults: { _controller: "DevBlogBundle:Post:show" } 
requirements: 
    _method: GET 
    id: \d+ 

Стандартный путь я генерировать URL для моего поста с помощью:

path('DevBlogBundle_post_show',{'id':post.id}) 

Я использую этот constrution во всех моих temlates/макеты, которые включают в себя список сообщений , Если я хочу изменить свой маршрут для post_show (скажем ... добавить параметр Slug /posts/{id}.{slug}), мне нужно будет изменить все мои temlates. Вместо этого я хочу, чтобы маршрут генерировать мой Post модель, что-то вроде:

public function getUrl(){ 
    return $this->generator->generate('DevBlogBundle_post_show',array (...params...));} 

Вопрос: Как я могу получить этот генератор для моей модели сообщение, что я должен «использовать ...» и как маршрут генерировать ?

В моих шаблонах я хочу разместить:

<a href="{{ post.getUrl() }}" ...>...</a> 

Спасибо заранее.

+0

Прежде всего, это плохая идея поместить getUrl в вашу модель, главным образом потому, что модель должна быть довольно глупой и не знать о том, как создавать URL-адреса. Один из способов - создать собственное расширение twig, которое может быть вызвано любым объектом определенного типа (например, сообщение и возвращает URL-адрес). Вы бы сделали что-то вроде '' {{post | url}} '' Прочитали о расширении ветки: http://www.kiwwito.com/article/extending-twig-in-symfony-2-add-custom-functions – Sgoettschkes

+0

Я знаю, как создать веточку добр. И, возможно, вы правы. I просто попытайтесь создать что-то вроде RoR «to_param». Я создам одну ветку ext, которую я буду использовать вместо стандартных «путей» и «url». – ZloyPotroh

+0

В этом случае вы можете посмотреть на пакет Sluggable. Maybethis - это то, что вы ищете: https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/sluggable.md – Sgoettschkes

ответ

5

Возбужденный этим вопросом и мыслями в моем предыдущем комментарии, я взломал вместе быстрое доказательство концепции, чтобы достичь того, что вы просите. Я реализовал функцию twig, которая может быть передана сущности и имя маршрута. Функция выполняет следующий setps для генерации URL:

  1. Получить маршрут, заданный по имени
  2. Компиляции маршрута
  3. Получите маршруты переменных
  4. цикла по переменным и попытаться вызвать согласно добытчикам на предприятие, чтобы создать массив параметров, которые необходимы в UrlGeneratorInterface для генерации маршруты URL-адрес
  5. Пусть генератор URL Symfony по генерации URL

Однако это означает, что параметры маршрута называются точно такими же свойствами в объектах, что ИМХО является хорошей практикой в ​​любом случае. Код должен быть помещен в расширение ветки, содержащее ссылку на контейнер обслуживания, введенную в свойство контейнера.

public function generateEntityUrl($entity,$routeName) 
{ 
    $router   = $this->container->get('router'); 
    $generator  = $router->getGenerator(); 
    $collection  = $router->getRouteCollection(); 
    $route   = $collection->get($routeName); 
    $compiledRoute = $route->compile(); 
    $variables  = $compiledRoute->getVariables(); 
    $parameters  = array(); 

    foreach($variables as $var) 
    { 
     $getter = 'get'.ucfirst($var); 
     $parameters[$var]=$entity->$getter(); 
    } 

    return $generator->generate($routeName,$parameters); 

} 

В прута вы можете вызвать функцию с {{post|entity_url('DevBlogBundle_post_show')}}.

Но я спрашиваю себя, почему в symfony еще нет реализации ... или почему я еще не нашел его.

+0

, возможно, вы захотите изучить маршрутизацию symfony cmf http://symfony.com/doc/master/cmf/getting_started/routing.html - не совсем то же самое, но, возможно, может помочь здесь. PR, конечно же, приветствуются. – dbu

1

Хорошо ... и до сих пор нет возможности передавать параметры сущности маршрутизатору. Ответа на этот вопрос room13 имеет смысл, но я думаю, чтобы сделать его проще:

В Twig шаблоны или Haml (настоятельно рекомендуем, сохранить свое время, это сделает вас счастливее: https://github.com/arnaud-lb/MtHamlBundle) и т.д.:

{{ path('route_name', entity.toParam()) }} 

и в Entity определить функции, как:

public function toParam(){ 

    // maybe some logic.... 

    return array(
    'id' => $this->id, 
    'slug' => $this->getSlug(), 
    .....other needed params 
); 
} 

Причина: Если параметры маршрута являются появился новый вариант, просто добавьте его в одном месте в Entity # toParam вместо найти, где используется маршрут, и перезаписать ll twig templates.

+0

Мне нравится идея 'toParam'. – eightyfive

Смежные вопросы