Symfony2获取控制器基本路由名称

时间:2013-05-24 10:33:16

标签: php symfony

我正试图从我的一个方法中获取Controller Class基本路由。 :

    /**
     * @Route("/buy-stuff", name="buy-stuff")
     * @Route("/sell-stuff" , name="for-sale")
     */
    class SalesController extends Controller
    {
        /**
         * @Route("/", name="salesindex")
         * @Template()
         */
         public function indexAction()
         {  
            //Get the entry route here. eg: 'buy-stuff' or 'sell-stuff'     
         }


     }

我试过了:

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

但据我所知,在那里没有任何用处:

Request Context

此外,如果您知道名称,则可以获得路线:

Route Collection

但显然,我不是在这种情况下。

5 个答案:

答案 0 :(得分:3)

Docs我发现它:

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

给我'买东西'或'卖东西';

取决于我的切入点。

答案 1 :(得分: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

答案 2 :(得分:2)

没有“基本路线”这样的东西。这些路线上的名称定义无效。

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

您的控制器中配置了Route Prefix,但没有名称。

使用以下内容在容器感知服务/控制器中获取当前路由名称:

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

第二个选项是控制器中$ _route的神奇插入。

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

在Twig中获取如下路线(仅适用于主要请求,而不是转发请求 - 使用ESI的carefulyl)

{{ 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"

答案 3 :(得分: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

答案 4 :(得分: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,
        );
     }


 }