2013-05-24 2 views
0

Я пытаюсь получить базовый маршрут класса Controller из одного из моих методов. :Symfony2 получить базовое имя контроллера

Я пробовал:

$this->container->get('router')->getContext() 

Но нет ничего полезного там, насколько я могу видеть:

Request Context

Кроме того, вы можете получить маршрут если вы знаете название:

Route Collection

Но, очевидно, я не в этом случае.

+0

пожалуйста, просмотрите мой ответ и спросить, если что-то неясно, так что я могу обновить его. в противном случае ответьте пожалуйста :) – nifr

+0

Я решил: из документов я нашел его: $ this-> container-> get ('request') -> getPathInfo(); дает мне «купить-материал» или «распродажу вещей» в зависимости от моей точки входа http://api.symfony.com/2.0/Symfony/Component/HttpFoundation/Request.html – Kikimac

+0

Это только половина история ... Если вы измените один из своих префиксов на/foo, getPathInfo() вернет foo, а не имя (т. е. бай-ины), которое вы связали с ним, и это был ваш исходный вопрос :) – nifr

ответ

2

Из Docs я нашел:

$this->container->get('request')->getPathInfo(); 

дает мне 'купить-материал' или 'продать-материал';

в зависимости от моей точки входа.

2

Нет такой вещи, как «базовый маршрут». Определения имен на этих маршрутах не будут иметь никакого эффекта.

/** 
    * @Route("/buy-stuff", name="buy-stuff") 
    * @Route("/sell-stuff" , name="for-sale") 
    */ 
Class XY 
{ 
    // ... 
} 

У вас есть Route Prefix настроенный в контроллере, который не имеет названия.

Получить текущее название маршрута в контейнерной курсе службы/контроллер:

$route = $this->container->get('request')->get('_route'); 

Второй вариант является магия insertation в $ _route в контроллере.

class MyController extends Controller 
{ 
    public function myAction($_route) 
    { 
     // ... 

В Twig получить маршрут вроде следующего (работает только для мастер-запросов, не пересылаемых из них - использование carefulyl с ESI)

{{ app.request.attributes.get('_route') }} 

То, что вы пытаетесь сделать, может быть достигнуто путем включения в именах маршрутов и имеют две конфигурации маршрутизации, каждая из которых имеет отдельный префикс из отдельного параметра контейнера.

# app/config/config.yml 
parameters: 
    acme.routep_refix.buy_stuff: /buy-stuff 
    acme.route_prefix.for_sale: /for-sale 

Теперь создать две маршрутизации конфигурации:

acme.buy_stuff: 
    prefix: %acme.route_prefix.buy_stuff% 
    resource: "@AcmeHelloBundle/Resources/config/routing_buy_stuff.yml" 

acme.buy_stuff: 
    prefix: %acme.route_prefix.for_salef% 
    resource: "@AcmeHelloBundle/Resources/config/routing_for_sale.yml" 
+0

$ route = $ this-> container-> get ('request') -> get ('_ route'); дает мне «salesindex», как и $ _route. – Kikimac

+0

Это правильное поведение. Нет такой вещи, как именованные префиксы маршрута. Его нужно решать с помощью параметров. Дайте несколько минут, и я включу пример :) – nifr

+0

Мне нужно было: '$ this-> container-> get (' request ') -> getPathInfo();' – Kikimac

3

Попробуйте это:

$name = 'buy-stuff'; // controller action name 
/** @var RouterInterface $router */ 
$router = $this->container->get('router'); 
$route = $router->getRouteCollection()->get($name); 
$controllerAction = $route->getDefault('_controller'); 
// also you can get a lot of information from the $route variable 
0

Вы должны использовать $_route в контроллере действий.

/** 
* @Route("/stuff", name="stuff") 
*/ 
class SalesController extends Controller 
{ 
    /** 
    * @Route("/buy", name="stuff_buy") 
    * @Route("/sell" , name="stuff_sale") 
    * @Template() 
    */ 
    public function indexAction($_route) 
    { 
     if ($_route === 'stuff_buy') { 
      $something = '...'; 
     } 
     if ($_route === 'stuff_sale') { 
      $something = '...'; 
     } 

     return array(
      'something' => $something, 
     ); 
    } 


} 
1

Вы также можете использовать специальный $_route переменную, которая устанавливается на название маршрута, который был сопрягать.

class BaseController extends Controller 
{ 
    // ... 

    /** 
    * @param $_route 
    */ 
    public function testAction($_route) 
    { 
     dump($_route); 

     // Or by request_stack: 
     dump($this->get('request_stack')->getCurrentRequest()->attributes->get('_route')); 

     // ... 
    } 

    // [...] 
} 

Подробнее: https://symfony.com/doc/current/book/routing.html#route-parameters-and-controller-arguments

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