2011-08-17 29 views

Trả lời

274

Từ cái gì đó là ContainerAware (như một bộ điều khiển):

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

@got một switchwation cho bạn kiểm tra http://meta.stackexchange.com/questions/155258/i-found-answers-for-a-question-not-really-correct-what-i-should -do –

+26

github.com/symfony/symfony/issues/854 request.attributes.get ('_ route') không đáng tin cậy vì nó chỉ dành cho mục đích gỡ lỗi (symfony dev nói) và không hoạt động nếu yêu cầu được chuyển tiếp ... xem câu trả lời của siêu tân tinh được ghi lại và không an toàn hơn – luiges90

+3

Lý do cho việc này không hoạt động khi một cái gì đó được chuyển tiếp là do bạn chuyển tiếp trực tiếp đến bộ điều khiển chứ không phải một tuyến đường. Như vậy, Symfony không biết lộ trình đó là gì. Thông thường, bạn có một tuyến đến một bộ điều khiển, do đó, có vẻ lạ rằng điều này không thể báo cáo bất cứ điều gì ngoài "_internal", tuy nhiên, có thể tạo các bộ điều khiển có mục đích chung được kết hợp với nhiều định nghĩa tuyến đường. Khi bạn xem xét tất cả những điều này, tôi nghĩ rằng "gotcha" này có ý nghĩa hơn. – jzimmerman2011

4

Tất cả tôi nhận được từ đó là _internal

tôi có được tên đường từ bên trong một bộ điều khiển với $this->getRequest()->get('_route'). Ngay cả những mã tuxedo25 đề xuất trả về _internal

Mã này được thực hiện trong cái được gọi là 'Thành phần' trong Symfony 1.X; Không phải là bộ điều khiển của trang mà là một phần của trang cần một số logic.

Mã tương đương trong Symfony 1.x là: sfContext::getInstance()->getRouting()->getCurrentRouteName();

+2

Giải quyết nó bản thân mình. Trong chế độ xem: '$ view ['request'] -> getParameter ('_ route');' – alexismorin

+5

điều này là do bạn đang sử dụng '{% render ...%}' cuộc gọi với 'standalone = true'. Với bộ nhớ đệm (AppCache).php hoặc véc ni với ESI) cho phép điều này sẽ làm cho các khung nhìn độc lập được yêu cầu với một HTTP-Request riêng biệt (đây là nơi mà route '_internal' đi vào hoạt động) theo thứ tự ro độc lập với bộ nhớ đệm. –

183

Với Twig: {{ app.request.attributes.get('_route') }}

+7

Cảm ơn bạn! Đang sử dụng '' để áp dụng css của trang cụ thể :) –

+9

github.com/symfony/symfony/issues/854 request.attributes.get ('_ route') không đáng tin cậy vì nó chỉ dành cho mục đích gỡ lỗi (symfony dev đã nói) và không hoạt động nếu yêu cầu được chuyển tiếp ... xem câu trả lời của siêu tân tinh được ghi lại và không an toàn hơn – luiges90

25

Symfony 2.0-2.1
Sử dụng này:

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

Đó là một sẽ không cung cấp cho bạn _internal.

Cập nhật cho Symfony 2.2+: Tính năng này không hoạt động bắt đầu từ Symfony 2.2+. Tôi đã mở một số bug và câu trả lời là "theo thiết kế". Nếu bạn muốn để có được các tuyến đường trong một tiểu hành động, bạn phải vượt qua nó như một cuộc tranh cãi

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

Và điều khiển của bạn:

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

https://github.com/symfony/symfony/issues/854 Tôi không chắc chắn về điều này, '$ route ['_ route']' có vẻ có vấn đề nhưng có thể không phải là các cuộc thảo luận về symfony dev. Sách dạy nấu ăn không đề cập đến '_route' của đầu ra' $ router-> match() '.. – luiges90

+0

Tôi hoàn toàn đồng ý với @ luiges90. PHPDoc của '$ router-> match()' nói "@return array Một mảng các tham số" có vẻ như _very_ internal. Tôi không muốn dựa vào nó, nhưng ngay bây giờ, nó có vẻ là giải pháp khả thi duy nhất khi giao dịch với các yêu cầu phụ. – netmikey

44

Tôi nghĩ rằng đây là cách dễ nhất để làm điều này:

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

    ..... 
+2

Bạn có thể thêm giải thích thêm hoặc hiển thị đầu ra mẫu để làm rõ cách giải quyết vấn đề này không? – Charlie

+7

@charlie http://symfony.com/doc/master/book/routing.html#route-parameters-and-controller-arguments – wdev

+1

@Charlie Đó là biến được xác định trước cung cấp cho bạn tuyến đường phù hợp "tên" – supernova

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

Bạn có thể lấy tên đường từ đối tượng yêu cầu từ bên trong bộ điều khiển.

17

Không có giải pháp nào phù hợp với tất cả các trường hợp sử dụng. Nếu bạn sử dụng phương thức $ request-> get ('_ route') hoặc các biến thể của nó, , nó sẽ trả về '_internal' cho các trường hợp chuyển tiếp diễn ra.

Nếu bạn cần một giải pháp mà làm việc ngay cả với chuyển tiếp, bạn phải sử dụng dịch vụ RequestStack mới, mà đến 2.4, nhưng này sẽ phá vỡ ESI support:

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

Bạn có thể làm cho một phần mở rộng cành lá trong số này nếu bạn cần nó trong các mẫu.

+0

Vậy ... giải pháp của bạn không hoạt động như thế nào cho tất cả các trường hợp sử dụng chính xác? – greg0ire

+1

Nó phá vỡ ESI, nhưng nếu không nó hoạt động trong mọi trường hợp. –

-1

nếu bạn muốn để có được tên tuyến đường trong điều khiển của bạn hơn bạn phải tiêm theo yêu cầu (thay vì nhận được từ thùng chứa do Symfony UPGRADE và hơn gọi get ('_ đường').

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

nếu bạn muốn để có được tên tuyến đường trong cành lá hơn bạn có để có được nó như

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

Không nên sử dụng '' '$ request-> get()' '' trực tiếp vì nó chậm: https://github.com/symfony/http-foundation/blob/2.8/Request.php#L712 –

9

_route không phải là con đường để đi và không bao giờ là. It was always meant for debugging purposes theo Fabien người đã tạo ra Symfony. đó là unreliab le vì nó sẽ không hoạt động với những thứ như chuyển tiếp và các cuộc gọi trực tiếp khác tới các bộ điều khiển như hiển thị từng phần.

Bạn cần phải tiêm tên của tuyến đường của bạn như một tham số trong điều khiển của bạn, see the doc here

Ngoài ra, xin vui lòng không bao giờ sử dụng $request->get(''); nếu bạn không cần sự linh hoạt đó là cách chậm hơn so với sử dụng được trên túi tài sản cụ thể mà bạn cần (thuộc tính, truy vấn hoặc yêu cầu) để $request->attributes->get('_route'); trong trường hợp này.

+1

Ok , về cơ bản bạn có đề xuất thêm thông tin bổ sung cho mọi tuyến đường trong tệp này thay vì nhận tên tuyến đường không? … Cách suy nghĩ và trả lời cuộc đấu tranh của mọi người là một trong những lý do ngày càng nhiều người HATE symfony. – Charaf

+1

Yep đặc biệt là nếu bạn cần để có thể gọi bộ điều khiển chính nó sau dòng xuống (chuyển tiếp, một phần rendering, vv ...) đi qua tên như một tham số là cách duy nhất ở đây bởi vì bạn không gọi một tuyến đường nào cả trường hợp. Đối với _route được sử dụng cho mục đích gỡ lỗi không đưa nó ra khỏi tôi ^^ ' –

+0

Bạn luôn có thể triển khai trình nghe tên tuyến của riêng bạn hoặc dịch vụ đơn giản tùy thuộc vào mức độ toàn cầu bạn cần bằng cách thêm trình xử lý yêu cầu trong đó bạn phân tích cú pháp url để tìm tên tuyến đường nhưng điều đó có vẻ nặng nề với tôi và vẫn sẽ không hoạt động với tiền đạo và như vậy. –

0

Để có được tuyến đường hiện tại dựa trên URL (đáng tin cậy hơn trong trường hợp chuyển tiếp):

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; 
} 
2

Đối với bất cứ ai mà cần lộ trình hiện tại cho Symfony 3, đây là những gì tôi sử dụng

<?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 
?> 
2

Với Symfony 3.3, tôi đã sử dụng phương pháp này và làm việc tốt.

Tôi có 4 tuyến đường như

admin_category_index, admin_category_detail, admin_category_create, admin_category_update

Và chỉ một dòng làm cho một lớp hoạt động cho tất cả các tuyến.

<li {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}> 
<a href="{{ path('admin_category_index') }}">Product Categoires</a> 
</li> 
Các vấn đề liên quan