ฉันจะรับเส้นทางปัจจุบันในSymfony 2 ได้อย่างไร
ตัวอย่างเช่นrouting.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
ฉันจะรับsomePage
ค่านี้ได้อย่างไร
ฉันจะรับเส้นทางปัจจุบันในSymfony 2 ได้อย่างไร
ตัวอย่างเช่นrouting.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
ฉันจะรับsomePage
ค่านี้ได้อย่างไร
คำตอบ:
จากสิ่งที่เป็น ContainerAware (เช่นตัวควบคุม):
$request = $this->container->get('request');
$routeName = $request->get('_route');
ด้วยทวิ: {{ app.request.attributes.get('_route') }}
<body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">
สำหรับการใช้หน้าเฉพาะ CSS :)
ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุดในการทำสิ่งนี้:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
{% render "SomeBundle:SomeController:someAction" %}
ที่คุณจะได้รับค่า '_internal' อีกครั้ง
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) { ... }
$route['_route']
ดูเหมือนจะเป็นปัญหา แต่อาจไม่ใช่ sym devony dev ที่พูดถึง ตำราไม่ได้กล่าวถึงเรื่อง_route
การ$router->match()
ส่งออก ..
$router->match()
บอกว่า "@ อาร์เรย์ย้อนกลับอาร์เรย์ของพารามิเตอร์" ซึ่งดูเหมือนว่าภายในมาก ฉันไม่ต้องการที่จะพึ่งพา แต่ตอนนี้ดูเหมือนว่าจะเป็นทางออกเดียวที่ทำงานได้เมื่อจัดการกับคำขอย่อย
ไม่มีวิธีแก้ปัญหาที่เหมาะกับทุกกรณีการใช้งาน หากคุณใช้วิธี $ request-> get ('_ route') หรือตัวแปรมันจะส่งกลับ '_internal'สำหรับกรณีที่เกิดการส่งต่อ
หากคุณต้องการโซลูชันที่ใช้งานได้แม้จะมีการส่งต่อคุณต้องใช้บริการ RequestStack ใหม่ซึ่งมาถึง 2.4 แต่สิ่งนี้จะทำให้ESI สนับสนุน :
$requestStack = $container->get('request_stack');
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI
if ($masterRequest) {
echo $masterRequest->attributes->get('_route');
}
คุณสามารถขยายกิ่งไม้ออกได้ถ้าคุณต้องการในแม่แบบ
_route
ไม่ได้เป็นวิธีที่จะไปและไม่เคยเป็น มันมีไว้สำหรับวัตถุประสงค์ในการดีบั๊กตาม Fabien ผู้สร้าง Symfony มันไม่น่าเชื่อถือเพราะจะไม่ทำงานกับสิ่งต่าง ๆ เช่นการส่งต่อและการโทรโดยตรงไปยังคอนโทรลเลอร์เช่นการเรนเดอร์บางส่วน
คุณต้องฉีดชื่อเส้นทางของคุณเป็นพารามิเตอร์ในคอนโทรลเลอร์ดูเอกสารที่นี่
นอกจากนี้โปรดอย่าใช้$request->get('');
ถ้าคุณไม่ต้องการความยืดหยุ่นมันเป็นวิธีที่ช้ากว่าการใช้รับในถุงทรัพย์สินเฉพาะที่คุณต้องการ (คุณลักษณะแบบสอบถามหรือคำขอ) ดังนั้น$request->attributes->get('_route');
ในกรณีนี้
$request->attributes->get('_route');
คุณสามารถรับชื่อเส้นทางจากวัตถุคำขอจากภายในคอนโทรลเลอร์
ทั้งหมดที่ฉันได้รับคือ
_internal
ฉันได้รับชื่อเส้นทางจากภายในคอนโทรลเลอร์ด้วย$this->getRequest()->get('_route').
แม้แต่โค้ด tuxedo25 ที่แนะนำให้ส่งคืน_internal
รหัสนี้ทำงานในสิ่งที่เรียกว่า 'Component' ใน Symfony 1.X; ไม่ใช่ตัวควบคุมของหน้า แต่เป็นส่วนหนึ่งของหน้าซึ่งต้องการตรรกะบางอย่าง
รหัสเทียบเท่าใน Symfony 1.X คือ: sfContext::getInstance()->getRouting()->getCurrentRouteName();
$view['request']->getParameter('_route');
{% render... %}
standalone=true
เมื่อเปิดใช้งานการแคช (AppCache.php หรือวานิชกับ ESI) สิ่งนี้จะทำให้มุมมองแบบสแตนด์อโลนได้รับการร้องขอด้วยการร้องขอ HTTP แยกกัน (นี่คือที่_internal
มาของการเล่นเส้นทาง) เพื่อให้แคชได้อย่างอิสระ
ด้วย 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>
ในการรับเส้นทางปัจจุบันตาม 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;
}
ด้วย 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" ไปยังหน้าที่ต้องการในเบราว์เซอร์ของฉัน
สำหรับใครที่ต้องการเส้นทางปัจจุบันสำหรับ 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.
?>
ถ้าคุณต้องการที่จะได้รับชื่อเส้นทางในตัวควบคุมของคุณกว่าที่คุณจะต้องฉีดคำขอ (แทนที่จะได้รับจากภาชนะเนื่องจากSymfony UPGRADE และกว่าโทรได้รับ ('_ เส้นทาง')
public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}
หากคุณต้องการชื่อเส้นทางเป็นทวิกกว่าที่คุณต้องการ
{{ app.request.attributes.get('_route') }}
$request->get()
โดยตรงเนื่องจากช้า: github.com/symfony/http-foundation/blob/2.8/Request.php#L712