Поиск маршрута в 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');
}
}
Ответы
Ответ 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);