Làm cách nào để có tuyến đường hiện tại trong Symfony 2?
Ví dụ routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Làm thế nào tôi có thể nhận được somePage
giá trị này ?
Làm cách nào để có tuyến đường hiện tại trong Symfony 2?
Ví dụ routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Làm thế nào tôi có thể nhận được somePage
giá trị này ?
Câu trả lời:
Từ thứ gì đó là ContainerAware (như bộ điều khiển):
$request = $this->container->get('request');
$routeName = $request->get('_route');
Với Twig: {{ app.request.attributes.get('_route') }}
<body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">
để áp dụng css dành riêng cho trang :)
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);
}
.....
{% render "SomeBundle:SomeController:someAction" %}
, nơi bạn sẽ nhận được giá trị '_iternal' một lần nữa.
Symfony 2.0-2.1
Sử dụng điều này:
$router = $this->get("router");
$route = $router->match($this->getRequest()->getPathInfo());
var_dump($route['_route']);
Điều đó sẽ không cung cấp cho bạn _internal
.
Cập nhật cho Symfony 2.2+: Điều này không hoạt động khi bắt đầu Symfony 2.2+. Tôi đã mở một lỗi và câu trả lời là "theo thiết kế". Nếu bạn muốn có được tuyến đường trong một hành động phụ, bạn phải chuyển nó thành một đối số
{{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }}
Và bộ điều khiển của bạn:
public function menuAction($route) { ... }
$route['_route']
có vẻ có vấn đề nhưng có thể không phải là symfony dev nói về. Các sách dạy nấu ăn không đề cập về _route
các $router->match()
đầu ra ..
$router->match()
nói "@return mảng Một mảng các tham số" có vẻ rất nội bộ. Tôi không muốn dựa vào nó, nhưng ngay bây giờ, nó dường như là giải pháp khả thi duy nhất khi xử lý các yêu cầu phụ.
Không có giải pháp nào hoạt động cho 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ề '_iternal' cho các trường hợp diễn ra chuyển tiếp.
Nếu bạn cần một giải pháp hoạt động ngay cả với chuyển tiếp, bạn phải sử dụng dịch vụ RequestStack mới, đã có trong 2.4, nhưng điều này sẽ phá vỡ hỗ trợ ESI :
$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ể tạo một phần mở rộng twig ra khỏi điều này nếu bạn cần nó trong các mẫu.
_route
không phải là cách để đi và không bao giờ được . Nó luôn có ý nghĩa cho mục đích gỡ lỗi theo Fabien, người đã tạo ra Symfony. Nó không đáng tin cậy 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 đến bộ điều khiển như kết xuất một phần.
Bạn cần thêm tên tuyến đường của mình làm tham số trong bộ điều khiển của mình, xem tài liệu ở đây
Ngoài ra, vui lòng không bao giờ sử dụng $request->get('');
nếu bạn không cần sự linh hoạt, nó chậm hơn so với việc sử dụng get trên túi thuộc tính cụ thể mà bạn cần (thuộc tính, truy vấn hoặc yêu cầu) vì vậy $request->attributes->get('_route');
trong trường hợp này.
$request->attributes->get('_route');
Bạn có thể lấy tên tuyến từ đối tượng yêu cầu từ trong bộ điều khiển.
Tất cả tôi nhận được từ đó là
_internal
Tôi nhận được tên tuyến đường từ bên trong bộ điều khiển với $this->getRequest()->get('_route').
Ngay cả mã tuxedo25 được đề xuất trả về_internal
Mã này được thực thi trong cái được gọi là 'Thành phần' trong Symfony 1.X; Không phải bộ điều khiển của trang mà là một phần của trang cần logic.
Mã tương đương trong Symfony 1.X là: sfContext::getInstance()->getRouting()->getCurrentRouteName();
$view['request']->getParameter('_route');
{% render... %}
các cuộc gọi với standalone=true
. Với bộ nhớ đệm (AppCache.php hoặc véc ni có ESI) được bật, điều này sẽ khiến các chế độ xem độc lập được yêu cầu với Yêu cầu HTTP riêng biệt (đây là nơi tuyến đường _internal
đi vào hoạt động) để ro có thể được lưu trữ độc lập.
Với Symfony 3.3, tôi đã sử dụng phương pháp này và hoạt động tốt.
Tôi có 4 tuyến đường như
admin_carget_index, admin_carget_detail, admin_carget_create, admin_carget_update
Và chỉ một dòng tạo ra 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 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;
}
Với Symfony 4.2.7, tôi có thể triển khai các mục sau trong mẫu twig của mình, hiển thị tên tuyến tùy chỉnh mà tôi đã xác định trong (các) bộ điều khiển của mình.
Trong index.html.twig
<div class="col">
{% set current_path = app.request.get('_route') %}
{{ current_path }}
</div>
Trong bộ điều khiển của tôi
...
class ArticleController extends AbstractController {
/**
* @Route("/", name="article_list")
* @Method({"GET"})
*/
public function index() {
...
}
...
}
Kết quả in ra "article_list" đến trang mong muốn trong trình duyệt của tôi.
Đối với bất kỳ ai cần tuyến đường 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
$name = $request->get('_route'); // This will return the name.
?>
nếu bạn muốn nhận tên tuyến trong bộ điều khiển của mình hơn bạn phải thực hiện yêu cầu (thay vì nhận từ container do Symfony UPGRADE và hơn gọi get ('_ route').
public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}
nếu bạn muốn có được tên tuyến đường trong twig hơn bạn phải có được nó như thế nào
{{ app.request.attributes.get('_route') }}
$request->get()
trực tiếp vì nó chậm: github.com/symfony/http-foundation/blob/2.8/Request.php#L712