मैं सिम्फनी 2 में वर्तमान मार्ग कैसे प्राप्त करूं ?
उदाहरण के लिए routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
मुझे यह somePage
मूल्य कैसे मिल सकता है ?
मैं सिम्फनी 2 में वर्तमान मार्ग कैसे प्राप्त करूं ?
उदाहरण के लिए routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
मुझे यह somePage
मूल्य कैसे मिल सकता है ?
जवाबों:
कंटेनर (एक नियंत्रक की तरह) कुछ से:
$request = $this->container->get('request');
$routeName = $request->get('_route');
टहनी के साथ: {{ app.request.attributes.get('_route') }}
<body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">
पृष्ठ-विशिष्ट सीएसएस लगाने के लिए उपयोग कर रहा हूँ :)
मुझे लगता है कि यह ऐसा करने का सबसे आसान तरीका है:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
{% render "SomeBundle:SomeController:someAction" %}
, जहां आपको फिर से '_internal' मान मिलेगा।
सिम्फनी 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) { ... }
$route['_route']
समस्यात्मक लगता है, लेकिन इसके बारे में सीम्फनी देव वार्ता नहीं हो सकती है। कुकबुक _route
में $router->match()
आउटपुट के बारे में उल्लेख नहीं है ..
$router->match()
PHPDoc का कहना है "मापदंडों का एक सरणी सरणी" जो बहुत आंतरिक लगता है । मैं इस पर भरोसा नहीं करना चाहता, लेकिन अभी, उप-अनुरोधों से निपटने के दौरान यह एकमात्र व्यवहार्य समाधान प्रतीत होता है।
कोई समाधान नहीं है जो सभी उपयोग के मामलों के लिए काम करता है। यदि आप $ अनुरोध का उपयोग करते हैं-> ('_ मार्ग') विधि, या इसके वेरिएंट का उपयोग करते हैं, तो यह उन मामलों के लिए '_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');
}
यदि आपको टेम्प्लेट में इसकी आवश्यकता है तो आप इसमें से एक टहनी का विस्तार कर सकते हैं।
_route
जाने का रास्ता नहीं है और कभी नहीं था । यह हमेशा फैबिन के अनुसार डिबगिंग उद्देश्यों के लिए था जिन्होंने सिम्फनी बनाया था। यह अविश्वसनीय है क्योंकि यह आंशिक रेंडरिंग जैसे नियंत्रकों को अग्रेषित करने और अन्य प्रत्यक्ष कॉल जैसी चीजों के साथ काम नहीं करेगा।
आपको अपने नियंत्रक में एक पैरामीटर के रूप में अपने मार्ग का नाम इंजेक्ट करने की आवश्यकता है, यहां डॉक्टर देखें
इसके अलावा, कृपया कभी भी उपयोग न करें $request->get('');
यदि आपको उस लचीलेपन की आवश्यकता नहीं है जिस तरह से यह विशिष्ट संपत्ति बैग पर प्राप्त करने की तुलना में धीमी है, जिसकी आपको आवश्यकता है (विशेषताएँ, क्वेरी या अनुरोध) तो $request->attributes->get('_route');
इस मामले में।
$request->attributes->get('_route');
आप नियंत्रक से अनुरोध ऑब्जेक्ट से मार्ग का नाम प्राप्त कर सकते हैं।
मुझे बस इतना ही मिल रहा है
_internal
मुझे एक कंट्रोलर के अंदर से रूट का नाम मिलता है, $this->getRequest()->get('_route').
यहां तक कि कोड tuxedo25 रिटर्न भी सुझाता है_internal
इस कोड को सिम्फनी 1.X में एक 'घटक' कहा जाता है; पेज का कंट्रोलर नहीं, बल्कि एक पेज का हिस्सा है जिसमें कुछ लॉजिक की जरूरत होती है।
सिम्फनी 1.X में बराबर कोड है: sfContext::getInstance()->getRouting()->getCurrentRouteName();
$view['request']->getParameter('_route');
{% render... %}
कॉल का उपयोग कर रहे हैं standalone=true
। कैशिंग के साथ (AppCache.php या ईएसआई के साथ वार्निश) सक्षम होने के कारण यह स्टैंडअलोन दृश्यों को एक अलग HTTP-रिक्वेस्ट के साथ अनुरोध करने का कारण होगा (यह वह जगह है जहां मार्ग _internal
खेलने में आता है) क्रम में ro स्वतंत्र रूप से कैची जाने योग्य है।
सिम्फनी 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;
}
सिम्फनी 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" प्रिंट करता है।
किसी के लिए जो सिम्फनी 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.
?>
यदि आप अपने कंट्रोलर में रूट का नाम प्राप्त करना चाहते हैं, तो आपको रिक्वेस्ट को इंजेक्ट करना होगा ( सिम्फनी 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