รับ URL ปัจจุบันในแม่แบบกิ่งไม้?


169

ผมมองไปรอบ ๆ สำหรับรหัสที่จะได้รับเส้นทางปัจจุบันในแม่แบบทวิ (และไม่ URL แบบเต็ม) คือผมไม่ต้องการผมจำเป็นเท่านั้นhttp://www.sitename.com/page/page


11
นี่ไม่ใช่การซ้ำซ้อนอย่างแน่นอนเนื่องจากคำตอบ # 2 มีข้อมูลที่จำเป็น (เกี่ยวกับพารามิเตอร์คำขอ) ที่คำถามที่เชื่อมโยงไม่ได้ให้ไว้ หนึ่งควรรวมคำตอบ # 2 เป็นคำถามที่เชื่อมโยง
Victor Sergienko

1
ลองใช้ app.request.requestUri
Kristóf Dombi

7
ไม่ใช่คนหลงกลเลย การลงคะแนนเพื่อเปิดใหม่ โพสต์คำตอบของฉันเป็นความคิดเห็นเพราะฉันไม่ได้รับอนุญาตที่จะตอบตอนนี้ ... {{ app.request.getBaseUrl ~ app.request.getPathInfo }}( getBaseUrlบิตเป็นตัวเลือกที่จำเป็นเฉพาะในกรณีที่ไม่ได้ติดตั้งไปยังรากของโดเมน)
mpen

คำตอบ:


250
{{ path(app.request.attributes.get('_route'),
     app.request.attributes.get('_route_params')) }}

หากคุณต้องการอ่านมันเป็นตัวแปรดู:

{% set currentPath = path(app.request.attributes.get('_route'),
                       app.request.attributes.get('_route_params')) %}

appตัวแปรมุมมองทั่วโลกมีทุกประเภทของทางลัดที่เป็นประโยชน์เช่นapp.sessionและapp.security.token.userที่อ้างอิงการบริการที่คุณอาจจะใช้ในการควบคุม


9
ขออภัยนี่จะใช้งานไม่ได้หากคุณมีเส้นทางที่มีพารามิเตอร์บังคับ
Martin Schuhfuß

หากคุณใช้ Twig ที่ไม่มี Symfony คุณสามารถทำสิ่งนี้: $ twig-> addGlobal ("CurrentUrl", $ _SERVER ["REQUEST_URI"]);
GateKiller

1
หากเส้นทางของคุณมีพารามิเตอร์ที่บังคับให้ดูคำตอบดังต่อไปนี้
Sam

@GateKiller นี่ทำให้การทดสอบการทำงานของฉันล้มเหลว:Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
Robin

ขอบคุณสำหรับคำตอบที่น่าอัศจรรย์มีประโยชน์มาก!
Vahe Shadunts

199

รับurl ปัจจุบัน : {{ app.request.uri }}ในSymfony 2.3, 3, 4, 5


รับเส้นทางเท่านั้น : {{ app.request.pathinfo }}(ไม่มีพารามิเตอร์)


รับคำร้องขอ uri : {{ app.request.requesturi }}(พร้อมพารามิเตอร์)


1
นี่เป็นคนเดียวที่ทำงานให้ฉัน คนอื่น ๆ ทั้งหมดพลาดพารามิเตอร์การสืบค้นที่ไม่ได้เป็นส่วนหนึ่งของเส้นทางหรือพึ่งพาตัวควบคุมและไม่ใช่ทวิก
เครก

13
ในการรับเส้นทางลอง{{ app.request.pathinfo }}หรือดูรายการวิธีการที่มีอยู่ใน/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
Michael

2
นี่ควรเป็นคำตอบที่ถูกต้อง สั้นและราบรื่น
Fabian Picone

2
uriรับ URL พร้อมพารามิเตอร์ pathinfoรับค่าพา ธ ด้วยพารามิเตอร์ NO requestUriรับค่าพา ธด้วยพารามิเตอร์ requestUriควรเพิ่มคำตอบนี้ IMO คุณไม่ค่อยต้องการโดเมนและไม่ค่อยต้องการลบพารามิเตอร์
rybo111

115

ใน symfony 2.1 คุณสามารถใช้สิ่งนี้:

{{ path(app.request.attributes.get('_route'), 
        app.request.attributes.get('_route_params')) }}

ใน symfony 2.0 โซลูชันหนึ่งคือการเขียนนามสกุลทวิกสำหรับสิ่งนี้

public function getFunctions()
{
    return array(
        'my_router_params' => new \Twig_Function_Method($this, 'routerParams'),
    );
}

/**
 * Emulating the symfony 2.1.x $request->attributes->get('_route_params') feature.
 * Code based on PagerfantaBundle's twig extension.
 */
public function routerParams()
{
    $router = $this->container->get('router');
    $request = $this->container->get('request');

    $routeName = $request->attributes->get('_route');
    $routeParams = $request->query->all();
    foreach ($router->getRouteCollection()->get($routeName)->compile()->getVariables() as $variable) {
        $routeParams[$variable] = $request->attributes->get($variable);
    }

    return $routeParams;
}

และใช้แบบนี้

{{ path(app.request.attributes.get('_route'), my_router_params()|merge({'additional': 'value'}) }}

คุณไม่จำเป็นต้องใช้ทั้งหมดยกเว้นว่าคุณต้องการเพิ่มพารามิเตอร์เพิ่มเติมให้กับลิงก์ของคุณเช่นในเพจเจอร์หรือคุณต้องการเปลี่ยนหนึ่งในพารามิเตอร์


11
หากคุณต้องการสร้างลิงค์ปัจจุบันในทวิกและเปลี่ยนสถานที่สำหรับการเปลี่ยนภาษาก็สามารถทำได้ใน Symfony 2.1 ดังนี้: {{path (app.request.attributes.get ('_ route'), app.request.attributes .get ('_ route_params') | ผสาน ({'_ locale': 'ja'}))}} มันอาจทำงานได้ถ้าคุณใช้นามสกุล Twig โดยBártfaiTamás
Naytzyrhc

สำหรับการติดตั้ง 2.0 ของคุณฉันได้รับข้อผิดพลาดที่บอกว่าไม่มีคอนเทนเนอร์ ดังนั้นฉันจึงเพิ่มตัวแปรตามที่ทำใน PagerfantaBundle แต่แล้วมันบอกว่าฉันต้องใช้ ContainerInterface หรือไม่
Squazic

คุณต้องสร้างนวกรรมิกสำหรับส่วนขยายนี้ซึ่งมีพารามิเตอร์ $ container จากนั้นในการกำหนดค่า DIC คุณต้องประกาศคอนเทนเนอร์เป็นพารามิเตอร์สำหรับส่วนขยาย ชอบที่นี่ใน TwigBundle
BártfaiTamás

12
_route_parameters จะไม่ทำงานหากคุณมีพารามิเตอร์เพิ่มเติมในสตริงการสืบค้นของคุณ คุณสามารถใช้ app.request.query.all แทน
wdev


20

ควรสังเกตว่าถ้าคุณมีพารามิเตอร์ข้อความค้นหาเพิ่มเติมใน URL ของคุณซึ่งไม่ใช่เป็นส่วนหนึ่งของเส้นทางที่กำหนดไว้คำตอบที่ยอมรับจะไม่รวมไว้ใน URL ปัจจุบัน (เส้นทาง)

ทำไมคุณต้องการพารามิเตอร์เพิ่มเติม

ตัวอย่างเช่นหากคุณมีหน้ารายการที่มีระเบียนที่สามารถกรองด้วยคำหลักและหน้านั้นมีการแบ่งหน้าน่าจะเป็นตัวแปรแบบสอบถามสำหรับ "คำหลัก" และ "หน้า" ส่วนใหญ่จะไม่อยู่ในเส้นทางของคุณ แต่ในปุ่มไปข้างหน้าและปุ่มย้อนกลับสำหรับการเพจคุณต้องใช้ URL ปัจจุบันเต็มรูปแบบ (ที่มีคำหลักเพื่อให้หน้าถัดไปยังคงถูกกรอง) และคุณต้องแก้ไขตัวแปรของหน้า

วิธีผสานในพารามิเตอร์การสืบค้นแบบพิเศษ

ดังนั้นคุณสามารถรับเส้นทางปัจจุบันและรวมในตัวแปรพิเศษ (หลังจากแก้ไขหนึ่งตัวแปรพิเศษเหล่านั้น) โปรดทราบว่าคุณกำลังผสานในตัวแปรของคุณเองไปแล้วผสานอาร์เรย์ที่เข้ามาในapp.request.query.all วิธีการที่คุณต้องให้พารามิเตอร์ทั้งหมดที่จำเป็นของเส้นทางซึ่งเป็นเหตุผลที่คุณจะต้องรวมถึงapp.request.attributes.get('_route_params')path()_route_params

{{ path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')|merge(app.request.query.all|merge({'page': 2 }))) }}

มันน่าเกลียดจริง ๆ แต่ถ้าคุณกำลังพัฒนาเลขหน้าคุณจะต้องแก้ไขตัวแปรเพจในแต่ละลิงค์แยกดังนั้นคุณต้องรวมสิ่งทั้งหมดในแต่ละครั้ง บางทีคนอื่นอาจมีทางออกที่ดีกว่า


2
น่าจะเป็น{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
FDisk

2

หากคุณกำลังใช้ Silex 2 คุณไม่สามารถเข้าถึงวัตถุคำขอได้อีกต่อไป

คุณสามารถเข้าถึงคุณลักษณะคำขอปัจจุบันด้วยวิธีนี้

app.request_stack.currentrequest.attributes.get('_route')

และเพื่อสร้าง URL ปัจจุบันแบบเต็ม: path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))


คุณจะได้รับ URL ปัจจุบันในทวิ / Silex 2 global.request.attributes.get('_route')เช่นนี้ จำเป็นต้องใช้ทวิกบริดจ์
dsoms
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.