Пользовательский класс маршрута - PullRequest
5 голосов
/ 05 декабря 2011

В symfony 1.4 вы можете определить собственный класс маршрута, где вы переопределяете генерацию URL с помощью пользовательской логики, например:

custom:
  class: sfDoctrineRouteCollection
  options:
    model:                Custom
    prefix_path:          /custom/category/:category_id
    column:               id
    route_class:          CustomDoctrineRoute

class CustomDoctrineRoute extends sfDoctrineRoute
{
  public function generate($params, $context = array(), $absolute = false)
  {
    if (!isset($params['category_id'])) {
      $params['category_id'] = sfContext::getInstance()->getRequest()->getParameter('category_id');
    }

    return parent::generate($params, $context, $absolute);
  }

}

Это позволяет писать url_for('custom_show', array('id'=> $object['id'])) и не беспокоиться о зависимых от контекстапараметры (category_id).

Как вы подходите к этому symfony2?

1 Ответ

3 голосов
/ 27 июня 2012

Я могу придумать 2 подхода к этому.Первый и самый простой - это расширить класс Router своим собственным и сказать Symfony использовать ваш класс в вашем файле parameters.yml или config.yml:

parameters:
    router.class: Company\CoreBundle\Routing\MyCustomRouter

Есть более мощный (читай: сложный)решение, которое позволяет вам определить больше зависимостей от вашего класса маршрутизатора путем переопределения или расширения всего маршрутизатора service .Существует пакет, который делает это и называется BeSimpleI18nRoutingBundle , на который вы можете посмотреть, как это делается.

В частности, обратите внимание на CompilerPass , где они заменяют службу router по умолчанию своей собственной.Затем вам нужно реализовать RouterInterface в вашем собственном классе маршрутизатора.В этом конкретном пакете они вводят исходный маршрутизатор по умолчанию (после его переименования в проходе компилятора).

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