Symfony 2 маршрутизация по модели - PullRequest
2 голосов
/ 25 февраля 2012

Sf2.0, стандартный блог, например.

Код роутинга.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})

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

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

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

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

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

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 21 мая 2012

Взволнованный этим вопросом и мыслями в моем предыдущем комментарии, я собрал быстрое доказательство концепции для достижения того, что вы просили. Я реализовал функцию ветки, которой можно передать сущность и имя маршрута. Функция выполняет следующие настройки для генерации 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 еще нет реализации ... или почему я еще не нашел ее.

1 голос
/ 08 марта 2013

Хорошо ... и до сих пор нет функциональности для передачи параметров сущности в маршрутизатор.Ответ от 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 вместо того, чтобы найти, где находитсяиспользуется маршрут и перезаписать все шаблоны веток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...