Symfony 2에서 현재 경로를 얻는 방법은 무엇입니까?


224

Symfony 2 에서 현재 경로를 어떻게 얻 습니까?

예를 들면 다음과 routing.yml같습니다.

somePage:
   pattern: /page/
   defaults: { _controller: "AcmeBundle:Test:index" }

somePage값을 어떻게 얻을 수 있습니까?

답변:


323

컨트롤러와 같은 ContainerAware에서 :

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

2
@got 당신을위한 switchwation 확인 meta.stackexchange.com/questions/155258/...을
NullPoiиteя

37
github.com/symfony/symfony/issues/854 request.attributes.get ( '_ route')는 디버그 목적으로 만 사용하기 때문에 (symfony dev에 따르면) 신뢰할 수 없으며 요청이 전달되면 작동하지 않습니다 ... 초신성 답변 참조 문서화되고보다 안전합니다
luiges90

3
무언가가 전달 될 때 이것이 작동하지 않는 이유는 경로가 아닌 컨트롤러로 직접 전달하기 때문입니다. 따라서 Symfony는 어떤 경로인지 알 수 없습니다. 일반적으로 하나의 컨트롤러에 대한 하나의 라우트가 있으므로 "_internal"외에는 아무것도보고 할 수없는 것이 이상하게 보일 수 있지만 둘 이상의 라우트 정의와 연관된 범용 컨트롤러를 작성할 수 있습니다. 이 모든 것을 고려할 때이 "gotcha"가 더 의미가 있다고 생각합니다.
jzimmerman2011

@ tuxedo25 RequestStack 사용에 대해 생각해보십시오 : symfony.com/blog/new-in-symfony-2-4-the-request-stack
mYkon

2
$ 요청-> get ( '_ route'); 느리다! $ 요청-> 속성-> get ( '_ route'); 유연성이 필요하지 않으면 더 좋습니다
Tom Tom

190

나뭇 가지로 : {{ app.request.attributes.get('_route') }}


8
감사합니다! <body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">페이지 특정 CSS를 적용하는 데 사용 중 입니다 :)
Salman von Abbas

10
github.com/symfony/symfony/issues/854 request.attributes.get ( '_ route')는 디버그 목적으로 만 사용하기 때문에 (symfony dev에 따르면) 신뢰할 수 없으며 요청이 전달되면 작동하지 않습니다 ... 초신성 답변 참조 문서화되고보다 안전합니다
luiges90

48

이것이 가장 쉬운 방법이라고 생각합니다.

class MyController extends Controller
{
    public function myAction($_route)
    {
        var_dump($_route);
    }

    .....

3
이 방법으로 문제를 해결하는 방법을 설명하기 위해 설명을 추가하거나 샘플 출력을 표시 할 수 있습니까?
Charlie


1
@Charlie 그것은 당신에게 일치하는 경로 "이름"을 제공하는 미리 정의 된 변수입니다
초신성

2
이것은 원래 질문에 대한 가장 좋은 대답입니다. 참고로 : 그러나 {% render "SomeBundle:SomeController:someAction" %}'_internal'값을 다시 얻는 곳 과 같은 하위 요청에서는 작동하지 않습니다 .
netmikey

2
안타깝게도 이것은 원래 액션에서만 작동하며 다른 기능은 전달되어야합니다.
Darek Wędrychowski

27

Symfony 2.0-2.1 이것을
사용하십시오 :

    $router = $this->get("router");
    $route = $router->match($this->getRequest()->getPathInfo());
    var_dump($route['_route']);

그 사람은 당신을 제공 하지 않습니다_internal .

Symfony 2.2 이상 업데이트 : Symfony 2.2 이상부터 작동하지 않습니다. 나는 버그를 열었고 그 대답은 "디자인에 의한 것"이었다. 하위 작업에서 경로를 얻으려면 인수로 경로를 전달해야합니다.

{{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }}

그리고 당신의 컨트롤러 :

public function menuAction($route) { ... }

github.com/symfony/symfony/issues/854 나는 이것에 대해 확신하지 못하고 $route['_route']문제가있는 것처럼 보이지만 심포니 개발자가 이야기하지 않을 수도 있습니다. 에 대해 언급하지 않습니다 요리 책 _route$router->match()출력 ..
luiges90

@ luiges90에 전적으로 동의합니다. 의하는 PHPDoc는 $router->match()것 같다 "매개 변수의 @return 배열 배열"라는 매우 내부. 나는 그것에 의존하고 싶지 않지만 지금은 하위 요청을 처리 할 때 유일하게 가능한 솔루션 인 것 같습니다.
netmikey

19

모든 사용 사례에 적합한 솔루션은 없습니다. $ request-> get ( '_ route') 메소드 또는 그 변형 을 사용하는 경우 전달이 발생한 경우 '_internal'리턴 합니다.

전달에서도 작동하는 솔루션이 필요한 경우 2.4에 도착한 새로운 RequestStack 서비스를 사용해야하지만 ESI 지원 이 중단됩니다 .

$requestStack = $container->get('request_stack');
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI
if ($masterRequest) {
    echo $masterRequest->attributes->get('_route');
}

템플릿에서 필요한 경우 나뭇 가지 확장을 만들 수 있습니다.


그렇다면… 귀하의 솔루션이 모든 사용 사례에 정확히 어떻게 적용되지 않습니까?
greg0ire

11

_route가는 길이 아니며 결코 없었다 . Symfony를 만든 Fabien에 따르면 항상 디버깅 목적으로 사용 되었습니다. 전달 및 부분 렌더링과 같은 컨트롤러에 대한 다른 직접 호출과 같은 작업에서는 작동하지 않으므로 신뢰할 수 없습니다.

컨트롤러에 경로 이름을 매개 변수로 주입해야합니다. 여기에서 문서를 참조하십시오

또한 $request->get('');유연성이 필요하지 않은 경우이 속성에서 필요한 특정 속성 백 (속성, 쿼리 또는 요청)을 사용하는 것보다 속도가 느립니다 $request->attributes->get('_route');.


4
좋아, 기본적으로 경로 이름을 얻는 대신이 파일의 모든 경로에 추가 정보를 추가하는 것이 좋습니다. ...
Charaf

1
특히, 나중에 컨트롤러 자체를 호출 할 수 있어야하는 경우 (앞으로, 부분 렌더링 등) 이름을 매개 변수로 전달하는 것은 경로를 전혀 호출하지 않기 때문에 유일한 방법입니다. 케이스. _route는 디버그 목적으로 사용되지 않습니다 ^^ '
Tom Tom

7
$request->attributes->get('_route');

컨트롤러 내에서 요청 오브젝트에서 라우트 이름을 얻을 수 있습니다.


4

내가 얻는 전부는 _internal

$this->getRequest()->get('_route'). 심지어 코드 tuxedo25 제안 된 반환 으로 컨트롤러 내부에서 경로 이름을 얻습니다._internal

이 코드는 Symfony 1.X의 'Component'에서 실행되었습니다. 페이지의 컨트롤러가 아니라 일부 로직이 필요한 페이지의 일부입니다.

Symfony 1.X의 해당 코드는 다음과 같습니다. sfContext::getInstance()->getRouting()->getCurrentRouteName();


2
직접 해결했습니다. 뷰에서 :$view['request']->getParameter('_route');
alexismorin

5
{% render... %}와 통화를 사용하고 있기 때문 입니다 standalone=true. 캐싱 (AppCache.php 또는 ESI가있는 바니시)을 활성화하면 독립 뷰를 별도의 HTTP 요청 (라우트가 실행되는 곳 _internal)으로 요청하여 독립적으로 캐시 할 수 있습니다.
Martin Schuhfuß

2

Symfony 3.3에서는이 방법을 사용하여 정상적으로 작동했습니다.

나는 같은 4 경로가

admin_category_index, admin_category_detail, admin_category_create, admin_category_update

그리고 한 줄만 모든 노선에 대해 활발한 수업을합니다.

<li  {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}>
 <a href="{{ path('admin_category_index') }}">Product Categoires</a>
</li>

1

URL을 기반으로 현재 경로를 가져 오려면 (전달의 경우 더 안정적 임) :

public function getCurrentRoute(Request $request)
{
    $pathInfo    = $request->getPathInfo();
    $routeParams = $this->router->match($pathInfo);
    $routeName   = $routeParams['_route'];
    if (substr($routeName, 0, 1) === '_') {
        return;
    }
    unset($routeParams['_route']);

    $data = [
        'name'   => $routeName,
        'params' => $routeParams,
    ];

    return $data;
}

0

Symfony 4.2.7을 사용하면 컨트롤러에서 정의한 사용자 지정 경로 이름을 표시하는 나뭇 가지 템플릿에서 다음을 구현할 수 있습니다.

index.html.twig에서

<div class="col">
    {% set current_path =  app.request.get('_route') %}
    {{ current_path }}
</div>

내 컨트롤러에서


    ...

    class ArticleController extends AbstractController {
        /**
         * @Route("/", name="article_list")
         * @Method({"GET"})
         */
        public function index() {
        ...
        }

        ...
     }

결과는 브라우저에서 원하는 페이지에 "article_list"를 인쇄합니다.


0

Symfony 3에 대한 현재 경로가 필요한 사람에게는 이것이 내가 사용하는 것입니다

<?php
   $request = $this->container->get('router.request_context');
   //Assuming you are on user registration page like https://www.yoursite.com/user/registration
   $scheme = $request->getScheme(); //This will return https
   $host = $request->getHost(); // This will return www.yoursite.com
   $route = $request->getPathInfo(); // This will return user/registration(don't forget this is registrationAction in userController
   $name = $request->get('_route'); // This will return the name.
?>

3
이것은 처리 된 경로 의 이름 을 반환하지 않습니다
Nico Haase

@NicoHaase 그것은 로켓 과학이 아니며, 당신은 이미 요청 객체를 가지고 있습니다
Aderemi Dayo

-2

컨트롤러에서 경로 이름을 얻으려면 Symfony UPGRADE 로 인해 컨테이너에서 가져 오는 대신 get ( '_ route')를 호출하는 대신 요청을 삽입해야 합니다.

public function indexAction(Request $request)
{
    $routeName = $request->get('_route');
}

당신은 당신이 그것을 얻는 것보다 나뭇 가지에 경로 이름을 얻으려면

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

1
사용하지 않는 것이 좋습니다 $request->get()가 느린 때문에 직접 : github.com/symfony/http-foundation/blob/2.8/Request.php#L712
ricko 조이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.