Twig टेम्पलेट में वर्तमान url प्राप्त करें?


169

मैंने एक Twig टेम्पलेट में वर्तमान पथ प्राप्त करने के लिए कोड के लिए चारों ओर देखा (और पूर्ण URL नहीं), अर्थात मुझे नहीं चाहिए http://www.sitename.com/page, मुझे केवल आवश्यकता है /page


11
यह एक सटीक डुप्लिकेट नहीं है, क्योंकि उत्तर # 2 में आवश्यक जानकारी (अनुरोध पैरामीटर के बारे में) है जो लिंक किए गए प्रश्न प्रदान नहीं करता है। लिंक किए गए प्रश्न में उत्तर # 2 का विलय करना चाहिए।
विक्टर सर्जेनको

1
app.request.requestUri का प्रयास करें।
३omb को क्रिस्टोफ डोम्बी

7
हूबहू नहीं। फिर से मतदान करना। मेरे उत्तर को एक टिप्पणी के रूप में पोस्ट करना क्योंकि मुझे अब जवाब देने की अनुमति नहीं है ... {{ app.request.getBaseUrl ~ app.request.getPathInfo }}( getBaseUrlबिट वैकल्पिक है; केवल जरूरत नहीं है तो डोमेन के रूट पर स्थापित होने की)
एमपीएन

जवाबों:


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
दुर्भाग्य से, यह काम नहीं करेगा यदि आपके पास अनिवार्य मापदंडों वाला मार्ग है।
मार्टिन शूफू

यदि आप ट्विग का उपयोग सिम्फनी के बिना कर रहे हैं तो आप कुछ इस तरह से कर सकते हैं: $ ट्विग-> एडग्लोबल ("करंटअर्ल", $ _SERVER ["REQUEST_URI"]);
गेटकिलर

1
यदि आपके मार्ग में अनिवार्य पैरामीटर हैं, तो नीचे दिए गए उत्तर को देखें
सैम

@GateKiller इसने मेरे कार्यात्मक परीक्षण को विफल कर दिया:Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
रॉबिन

एक अद्भुत जवाब के लिए धन्यवाद, बहुत उपयोगी!
वही शाद्स

199

जाओ वर्तमान यूआरएल : {{ app.request.uri }}में Symfony 2.3, 3, 4, 5


केवल पथ प्राप्त करें : {{ app.request.pathinfo }}(मापदंडों के बिना)


अनुरोध प्राप्त करें उरी : {{ app.request.requesturi }}(मापदंडों के साथ)


1
यह एकमात्र ऐसा है जिसने मेरे लिए काम किया। अन्य सभी क्वेरी पैरामीटर से चूक गए जो मार्ग का हिस्सा नहीं थे, या नियंत्रक पर निर्भर थे और बजाय ट्विग के।
क्रेग

13
पथ प्राप्त करने के लिए केवल कोशिश करें {{ app.request.pathinfo }}या उपलब्ध तरीकों की सूची देखें/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
माइकल

2
यह सही उत्तर होना चाहिए। छोटा और चिकना।
फेबियन पॉनिकॉन

2
uriपैरामीटर के साथ URL मिलता है। कोई मापदंडों के pathinfoसाथ पथ हो जाता है । मापदंडों के साथ रास्ता मिलता है । इस उत्तर IMO में जोड़ा जाना चाहिए। आपको शायद ही कभी डोमेन की आवश्यकता होगी, और आप शायद ही कभी मापदंडों को निकालना चाहेंगे। requestUrirequestUri
rybo111

115

सिम्फनी 2.1 में आप इसका उपयोग कर सकते हैं:

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

सिम्फनी 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
यदि आप ट्विग में वर्तमान लिंक उत्पन्न करना चाहते हैं और भाषा स्विचिंग के लिए स्थान बदलना चाहते हैं, तो यह सिम्फनी 2.1 में निम्नानुसार किया जा सकता है: {{पथ (app.request.attributes.get ('_ मार्ग'), ऐप .request.attributes .get ('_ path_params') | मर्ज करें ({'_ locale': 'ja'}))}}} यह काम कर सकता है यदि आप Bártfai Tamás द्वारा ट्विग एक्सटेंशन का उपयोग करते हैं
Naytzyratc

आपके 2.0 के कार्यान्वयन के लिए, मुझे यह कहते हुए एक त्रुटि मिलती है कि कोई कंटेनर नहीं है। तो मैंने वैरिएबल जोड़ा जैसा कि पेजरफैंटा बंडले में किया गया है, लेकिन फिर यह कहता है कि मुझे कंटेनरइंटरफेस लागू करना है?
स्क्वाज़िक

आपको इस एक्सटेंशन के लिए एक कंस्ट्रक्टर बनाना होगा, जिसमें $ कंटेनर पैरामीटर है। फिर डीआईसी कॉन्फ़िगरेशन में आपको कंटेनर को विस्तार के लिए एक पैरामीटर के रूप में घोषित करना होगा। यहाँ की तरह TwigBundle
Bártfai Tamás

12
यदि आपके क्वेरी स्ट्रिंग में कुछ अतिरिक्त परमान हैं, तो _route_parameters काम नहीं करेंगे। आप इसके बजाय app.request.query.all का उपयोग कर सकते हैं।

34

आप इस तरह से Twig में वर्तमान URL प्राप्त कर सकते हैं:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}

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'))


आप टहनी / Silex 2 इस तरह में वर्तमान URL प्राप्त कर सकते हैं: global.request.attributes.get('_route')टहनी पुल की आवश्यकता है।
dsoms
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.