Подтвердить что ты не робот

Поиск маршрута в symfony 2

Я определил маршрут в моем файле маршрутизации приложения:

RouteName:
    pattern:  /some/route
    defaults: { _controller: MyAppBundle:Controller:action }

В контроллере я могу использовать:

$this->get('router')->generate('RouteName');

Как я могу просто получить доступ к этому из нового класса, который я создаю, например класс представления, который ничего не расширяет:

namespace My\AppBundle\View;

class ViewClass {
    public function uri()
    {
        return getTheRoute('RouteName');
    }
}
4b9b3361

Ответ 1

Вам нужно ввести услугу "роутер" в свой ViewClass. Например. где вы определяете свой сервис ViewClass:

viewclass.service:
    class: Namespace\For\ViewClass
    arguments:
       router: "@router"

а затем в вашем конструкторе:

public function __construct(\Symfony\Bundle\FrameworkBundle\Routing\Router $router)
{
    $this->router = $router;
}

Ответ 2

Подсказка заключается в том, как метод $this->generateUrl() работает в контроллерах. См:

/**
 * Generates a URL from the given parameters.
 *
 * @param string  $route      The name of the route
 * @param mixed   $parameters An array of parameters
 * @param Boolean $absolute   Whether to generate an absolute URL
 *
 * @return string The generated URL
 */
public function generateUrl($route, $parameters = array(), $absolute = false)
{
    return $this->container->get('router')->generate($route, $parameters, $absolute);
}

Итак, вам нужно определить свой класс как услугу и ввести службу @router. Либо это, либо ваш класс реализует ContainerAwareInterface, но первый метод определенно будет лучше.

Ответ 3

Вы должны зарегистрировать свой класс в качестве службы и вставить маршрутизатор в качестве зависимости.

См. главу в контейнере услуг в превосходных документах symfony2.

Если вы не знакомы с концепциями контейнера обслуживания и инъекции зависимостей, вы можете почувствовать себя немного перегруженным. Однако постарайтесь понять это, потому что это важная часть архитектуры symfony2.

Ответ 4

Вы можете передать весь контейнер из своего контроллера в класс просмотра при создании экземпляра. Это НЕ ЛУЧШАЯ ПРАКТИКА и не рекомендуется.

class View
{
  protected $container;

  public function __construct(\Symfony\Component\DependencyInjection\Container $container)
  {
    $this->container = $container;
  }
}

Затем в вашем коде вы можете использовать

$this->container->get('router')->generate($route, $parameters, $absolute);