सिम्फनी 2 में वर्तमान मार्ग कैसे प्राप्त करें?


224

मैं सिम्फनी 2 में वर्तमान मार्ग कैसे प्राप्त करूं ?

उदाहरण के लिए routing.yml:

somePage:
   pattern: /page/
   defaults: { _controller: "AcmeBundle:Test:index" }

मुझे यह somePageमूल्य कैसे मिल सकता है ?

जवाबों:


323

कंटेनर (एक नियंत्रक की तरह) कुछ से:

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

2
@ आप के लिए एक स्विचगेट भूल गए हैं meta.stackexchange.com/questions/155258/…
NullPoiиteя

37
github.com/symfony/symfony/issues/854 request.attributes.get ('_ मार्ग') विश्वसनीय नहीं है क्योंकि यह केवल डीबग उद्देश्य के लिए है (सिम्फनी देव ने कहा) और काम नहीं करता है यदि अनुरोध अग्रेषित किया जाता है ... सुपरनोवा का उत्तर देखें जो प्रलेखित हैं और अधिक विफल-सुरक्षित हैं
luiges90

3
जब कुछ अग्रेषित किया जाता है तो इसके काम न करने का कारण इस तथ्य के कारण होता है कि आप सीधे नियंत्रक के पास जाते हैं, मार्ग के नहीं। इस प्रकार, सिम्फनी को पता नहीं है कि वह किस मार्ग के लिए है। आमतौर पर, आपके पास एक नियंत्रक के लिए एक मार्ग है, इसलिए यह अजीब लग सकता है कि यह "_internal" के अलावा कुछ भी रिपोर्ट नहीं कर सकता है, हालांकि, सामान्य-उद्देश्य नियंत्रकों को बनाना संभव है जो एक से अधिक मार्ग परिभाषा से जुड़े होते हैं। जब आप इस सब पर विचार करते हैं, तो मुझे लगता है कि यह "गोच" अधिक समझ में आता है।
jizimmerman2011

@ tuxedo25 RequestStack का उपयोग करने के बारे में सोचें: symfony.com/blog/new-in-symfony-2-4-the-request-stack
mYkon

2
$ अनुरोध> प्राप्त ( '_ मार्ग'); धीमा है ! $ अनुरोध> attributes-> प्राप्त ( '_ मार्ग'); बेहतर है अगर आपको लचीलेपन की आवश्यकता नहीं है
टॉम टॉम

190

टहनी के साथ: {{ app.request.attributes.get('_route') }}


8
धन्यवाद! <body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">पृष्ठ-विशिष्ट सीएसएस लगाने के लिए उपयोग कर रहा हूँ :)
सलमान वॉन अब्बास

10
github.com/symfony/symfony/issues/854 request.attributes.get ('_ मार्ग') विश्वसनीय नहीं है क्योंकि यह केवल डीबग उद्देश्य के लिए है (सिम्फनी देव ने कहा) और काम नहीं करता है यदि अनुरोध अग्रेषित किया जाता है ... सुपरनोवा का उत्तर देखें जो प्रलेखित हैं और अधिक विफल-सुरक्षित हैं
luiges90

48

मुझे लगता है कि यह ऐसा करने का सबसे आसान तरीका है:

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

    .....

3
क्या आप अधिक स्पष्टीकरण जोड़ सकते हैं या यह स्पष्ट करने के लिए नमूना आउटपुट दिखा सकते हैं कि यह समस्या को कैसे हल करता है?
चार्ली


1
@Charlie यह एक पूर्वनिर्धारित चर है जो आपको मेल खाता मार्ग "नाम" देता है
सुपरनोवा

2
यह निश्चित रूप से मूल प्रश्न का सबसे अच्छा जवाब है। एक साइड नोट के रूप में: यह काम नहीं करता है, हालांकि, जैसे उप-अनुरोधों के साथ {% render "SomeBundle:SomeController:someAction" %}, जहां आपको फिर से '_internal' मान मिलेगा।
netmikey

2
अफ़सोस की बात यह है कि यह केवल मूल क्रिया में काम करता है, किसी अन्य फ़ंक्शन के लिए इसे अग्रेषित करना पड़ता है।
डेरेक वोर्रीचोव्स्की

27

सिम्फनी 2.0-2.1 इसका
उपयोग करें:

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

वह आपको नहीं देगा _internal

सिम्फनी 2.2+ के लिए अपडेट: यह सिम्फनी 2.2+ शुरू करने पर काम नहीं कर रहा है। मैंने एक बग खोला और जवाब "डिजाइन द्वारा" था। यदि आप एक उप-कार्रवाई में मार्ग प्राप्त करना चाहते हैं, तो आपको इसे एक तर्क के रूप में पारित करना होगा

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

और आपका नियंत्रक:

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

github.com/symfony/symfony/issues/854 मुझे इस बारे में निश्चित नहीं है, $route['_route']समस्यात्मक लगता है, लेकिन इसके बारे में सीम्फनी देव वार्ता नहीं हो सकती है। कुकबुक _routeमें $router->match()आउटपुट के बारे में उल्लेख नहीं है ..
luiges90

मैं @ luiges90 से पूरी तरह सहमत हूं। $router->match()PHPDoc का कहना है "मापदंडों का एक सरणी सरणी" जो बहुत आंतरिक लगता है । मैं इस पर भरोसा नहीं करना चाहता, लेकिन अभी, उप-अनुरोधों से निपटने के दौरान यह एकमात्र व्यवहार्य समाधान प्रतीत होता है।
netmikey

19

कोई समाधान नहीं है जो सभी उपयोग के मामलों के लिए काम करता है। यदि आप $ अनुरोध का उपयोग करते हैं-> ('_ मार्ग') विधि, या इसके वेरिएंट का उपयोग करते हैं, तो यह उन मामलों के लिए '_internal' लौटाएगा जहां अग्रेषण हुआ था।

यदि आपको एक समाधान की आवश्यकता है जो अग्रेषण के साथ भी काम करता है, तो आपको नई रिक्वेस्टस्टैक सेवा का उपयोग करना होगा, जो 2.4 में आया था, लेकिन इससे ईएसआई समर्थन टूट जाएगा :

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

यदि आपको टेम्प्लेट में इसकी आवश्यकता है तो आप इसमें से एक टहनी का विस्तार कर सकते हैं।


तो ... कैसे आपका समाधान सभी उपयोग-मामलों के लिए बिल्कुल काम नहीं करता है?
greg0ire

11

_routeजाने का रास्ता नहीं है और कभी नहीं थायह हमेशा फैबिन के अनुसार डिबगिंग उद्देश्यों के लिए था जिन्होंने सिम्फनी बनाया था। यह अविश्वसनीय है क्योंकि यह आंशिक रेंडरिंग जैसे नियंत्रकों को अग्रेषित करने और अन्य प्रत्यक्ष कॉल जैसी चीजों के साथ काम नहीं करेगा।

आपको अपने नियंत्रक में एक पैरामीटर के रूप में अपने मार्ग का नाम इंजेक्ट करने की आवश्यकता है, यहां डॉक्टर देखें

इसके अलावा, कृपया कभी भी उपयोग न करें $request->get('');यदि आपको उस लचीलेपन की आवश्यकता नहीं है जिस तरह से यह विशिष्ट संपत्ति बैग पर प्राप्त करने की तुलना में धीमी है, जिसकी आपको आवश्यकता है (विशेषताएँ, क्वेरी या अनुरोध) तो $request->attributes->get('_route');इस मामले में।


4
ठीक है, आप मूल रूप से मार्ग का नाम प्राप्त करने के बजाय इस फ़ाइलों में प्रत्येक मार्गों में अतिरिक्त जानकारी जोड़ने का सुझाव देते हैं? ...
Charaf

1
हां, खासतौर पर यदि आपको कंट्रोलर को बाद में लाइन के नीचे (फॉरवर्ड, आंशिक रेंडरिंग आदि) कॉल करने में सक्षम होना है ... तो एक पैरामीटर के रूप में नाम पास करना यहां एकमात्र तरीका है क्योंकि आप उस पर एक रूट नहीं बुला रहे हैं मामला। डीबग उद्देश्यों के लिए _route के रूप में यह मेरे लिए बाहर नहीं ले जा रहा है ^ ^ '
टॉम टॉम

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

आप नियंत्रक से अनुरोध ऑब्जेक्ट से मार्ग का नाम प्राप्त कर सकते हैं।


4

मुझे बस इतना ही मिल रहा है _internal

मुझे एक कंट्रोलर के अंदर से रूट का नाम मिलता है, $this->getRequest()->get('_route'). यहां तक ​​कि कोड tuxedo25 रिटर्न भी सुझाता है_internal

इस कोड को सिम्फनी 1.X में एक 'घटक' कहा जाता है; पेज का कंट्रोलर नहीं, बल्कि एक पेज का हिस्सा है जिसमें कुछ लॉजिक की जरूरत होती है।

सिम्फनी 1.X में बराबर कोड है: sfContext::getInstance()->getRouting()->getCurrentRouteName();


2
इसे खुद हल किया। एक दृश्य में:$view['request']->getParameter('_route');
एलेक्सिस्मिनिन ऑक्ट

5
इसका कारण यह है कि आप {% render... %}कॉल का उपयोग कर रहे हैं standalone=true। कैशिंग के साथ (AppCache.php या ईएसआई के साथ वार्निश) सक्षम होने के कारण यह स्टैंडअलोन दृश्यों को एक अलग HTTP-रिक्वेस्ट के साथ अनुरोध करने का कारण होगा (यह वह जगह है जहां मार्ग _internalखेलने में आता है) क्रम में ro स्वतंत्र रूप से कैची जाने योग्य है।
मार्टिन शूफू

2

सिम्फनी 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>

1

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

0

सिम्फनी 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" प्रिंट करता है।


0

किसी के लिए जो सिम्फनी 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.
?>

3
यह संभाले हुए मार्ग का नाम नहीं लौटाएगा
निको हसे

@NicoHaase यह रॉकेट विज्ञान नहीं है, आप पहले से ही अनुरोध वस्तु हो रही है
Aderemi Dayo

-2

यदि आप अपने कंट्रोलर में रूट का नाम प्राप्त करना चाहते हैं, तो आपको रिक्वेस्ट को इंजेक्ट करना होगा ( सिम्फनी UPGRADE के कारण कंटेनर से मिलने के बजाय और कॉल गेट ('_ मार्ग') से।

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

यदि आप टहनी में रूट नाम प्राप्त करना चाहते हैं तो आपको इसे प्राप्त करना होगा

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

1
यह $request->get()धीमी गति से होने के कारण सीधे उपयोग करने की अनुशंसा नहीं की जाती है : github.com/symfony/http-foundation/blob/2.8/Request.php#L712
रिको झो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.