সিমফনি 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
@got আপনার জন্য একটি switchwation পরীক্ষা meta.stackexchange.com/questions/155258/...
NullPoiиteя

37
github.com/symfony/symfony/issues/854 অনুরোধ.attributes.get ('_ রুট') নির্ভরযোগ্য নয় কারণ এটি কেবল ডিবাগ উদ্দেশ্যে (সিমফনি দেব বলেছেন) এবং অনুরোধটি অগ্রণী করা হলে কাজ করে না ... দেখুন সুপারনোবার উত্তর যা নথিভুক্ত এবং আরও ব্যর্থ-নিরাপদ
luiges90

3
যখন কিছু ফরোয়ার্ড করা হয় তখন এটি কাজ না করার কারণ হ'ল আপনি সরাসরি কোনও নিয়ামকের কাছে ফরোয়ার্ড করেন, কোনও রুট নয়। যেমন, সিমফনি জানেন না যে কোন পথে চলবে। সাধারণত, আপনার কাছে একটি নিয়ামকের কাছে একটি রুট রয়েছে, তাই এটি অদ্ভুত বলে মনে হতে পারে যে এটি "_ আন্তঃ" এর বাইরে কিছু জানাতে পারে না, তবে, সাধারণ-উদ্দেশ্য নিয়ন্ত্রকগুলি তৈরি করা সম্ভব যা একাধিক রুটের সংজ্ঞার সাথে যুক্ত হয়। আপনি যখন এই সমস্ত বিষয় বিবেচনা করেন, তখন আমার মনে হয় এই "গোটচা" আরও অর্থবোধ করে।
jzimmerman2011

@ tuxedo25 রিকোয়েস্টস্ট্যাকটি ব্যবহার করার বিষয়ে চিন্তা করুন: symfony.com/blog/new-in-symfony-2-4-therequest-stack
mYkon

2
$ request-> পান (_ রুট '); ধীর ! $ request-> attributes-> পান (_ রুট '); আপনার নমনীয়তার প্রয়োজন না হলে আরও ভাল
টম টম

190

টুইগ সহ: {{ app.request.attributes.get('_route') }}


8
ধন্যবাদ! <body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">পৃষ্ঠা-নির্দিষ্ট সিএসএস প্রয়োগের জন্য আমি ব্যবহার করছি :)
সালমান ভন আব্বাস

10
github.com/symfony/symfony/issues/854 অনুরোধ.attributes.get ('_ রুট') নির্ভরযোগ্য নয় কারণ এটি কেবল ডিবাগ উদ্দেশ্যে (সিমফনি দেব বলেছেন) এবং অনুরোধটি অগ্রণী করা হলে কাজ করে না ... দেখুন সুপারনোবার উত্তর যা নথিভুক্ত এবং আরও ব্যর্থ-নিরাপদ
luiges90

48

আমি মনে করি এটি এটি করার সবচেয়ে সহজ উপায়:

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

    .....

3
আপনি আরও ব্যাখ্যা যুক্ত করতে পারেন বা এটি কীভাবে সমস্যার সমাধান করে তা পরিষ্কার করার জন্য নমুনা আউটপুট প্রদর্শন করতে পারেন?
চার্লি 18


1
@ চার্লি এটি একটি পূর্বনির্ধারিত পরিবর্তনশীল যা আপনাকে ম্যাচের রুটটি "নাম" দেয়
সুপারনোভা

2
এটি অবশ্যই মূল প্রশ্নের সেরা উত্তর। পার্শ্ব দ্রষ্টব্য হিসাবে: এটি উপ-অনুরোধগুলির সাথে কার্যকর হয় না {% render "SomeBundle:SomeController:someAction" %}, যেখানে আপনি আবার '_ আন্তঃ' মান পাবেন।
নেটমিকি

2
দুঃখের বিষয় হচ্ছে এটি কেবল আসল অ্যাকশনে কাজ করে, অন্য কোনও ফাংশনের জন্য এটি ফরোয়ার্ড করতে হবে।
দারেক ওদ্রিচোস্কি

27

সিমফনি ২.০-২.১ এটি
ব্যবহার করুন:

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

সে আপনাকে দেবে না_internal

সিমফনি ২.২++ এর জন্য আপডেট: এটি সিমফনি ২.২+ শুরু করে কাজ করছে না। আমি একটি বাগ খুললাম এবং উত্তরটি ছিল "ডিজাইনের মাধ্যমে"। আপনি যদি কোনও সাব-অ্যাকশনে রুটটি পেতে চান তবে আপনাকে অবশ্যই এটি যুক্তি হিসাবে পাস করতে হবে

{{ 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 এর সাথে সম্পূর্ণ সম্মত agree পিএইচপিডোক $router->match()" @ পুনর্বার অ্যারে" প্যারামিটারগুলির একটি অ্যারে "বলেছেন যা খুব অভ্যন্তরীণ বলে মনে হয় । আমি এটির উপর নির্ভর করতে চাই না, তবে এই মুহূর্তে, সাব-অনুরোধগুলি মোকাবেলা করার সময় এটি কেবলমাত্র একটি কার্যকর সমাধান বলে মনে হচ্ছে।
নেটমিকি

19

কোনও ব্যবহার নেই যা সমস্ত ব্যবহারের ক্ষেত্রে কার্যকর হয়। আপনি যদি $ অনুরোধ-> পান ('_ রুট') পদ্ধতি বা এর রূপগুলি ব্যবহার করেন তবে যেসব ফরোয়ার্ডিং হয়েছিল সেখানে এটি '_ আন্তঃআ' ফিরিয়ে দেবে

যদি আপনার এমন কোনও সমাধানের প্রয়োজন হয় যা ফরওয়ার্ডিংয়ের সাথেও কাজ করে তবে আপনাকে নতুন রিকোয়েস্টস্ট্যাক পরিষেবাটি ব্যবহার করতে হবে, এটি ২.৪ এ পৌঁছেছে, তবে এটি ESI সমর্থনটি ভঙ্গ করবে :

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

টেম্পলেটগুলিতে এটির প্রয়োজন হলে আপনি এটি থেকে একটি দ্বিগুণ প্রসার বাড়িয়ে নিতে পারেন।


সুতরাং… আপনার সমাধান সমস্ত ব্যবহারের ক্ষেত্রে ঠিক কীভাবে কাজ করে না?
গ্রেগ 01 ই

11

_routeযাওয়ার উপায় নয় এবং কখনও ছিল নাএটি সর্বদা সিম্ফনি তৈরির ফ্যাবিয়েনের মতে ডিবাগিংয়ের উদ্দেশ্যে করা হয়েছিল। এটি অবিশ্বস্ত কারণ এটি আংশিক রেন্ডারিংয়ের মতো নিয়ন্ত্রণকারীদের কাছে ফরোয়ার্ডিং এবং অন্যান্য প্রত্যক্ষ কলগুলির মতো জিনিসগুলির সাথে কাজ করবে না।

আপনার নিয়ামকটিতে আপনাকে নিজের রুটের নামটি প্যারামিটার হিসাবে ইনজেকশনের প্রয়োজন, দস্তাবেজটি এখানে দেখুন

এছাড়াও, দয়া করে $request->get('');আপনার যদি প্রয়োজন সুনির্দিষ্ট সম্পত্তি ব্যাগটি ব্যবহারের চেয়ে ধীরে ধীরে ধীরে ধীরে নমনীয়তা না প্রয়োজন তবে এটি ব্যবহার করুন (বৈশিষ্ট্য, ক্যোয়ারী বা অনুরোধ) সুতরাং এক্ষেত্রে $request->attributes->get('_route');


4
ঠিক আছে, আপনি মূলত এই ফাইলগুলির প্রতিটি রুটে অতিরিক্ত রুটটির নাম না দিয়ে অতিরিক্ত তথ্য যুক্ত করার পরামর্শ দিচ্ছেন? …
চারাফ

1
হ্যাঁ, বিশেষত যদি আপনার নিয়ামককে পরে লাইনটি (ফরোয়ার্ডস, আংশিক রেন্ডারিং, ইত্যাদি ...) নামিয়ে আনতে পারা প্রয়োজন হয় তবে নামটি প্যারামিটার হিসাবে পাস করা এখানেই একমাত্র উপায় কারণ আপনি যে কোনও পথেই কল করছেন না are কেস। যেমন _আরউটিংয়ের উদ্দেশ্য ডিবাগ উদ্দেশ্যে করা হচ্ছে তা আমার উপর নেবেন না
Tom

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

আপনি নিয়ামকের মধ্যে থেকে অনুরোধ অবজেক্ট থেকে রুটের নামটি পেতে পারেন।


4

আমি যে সব পেয়ে যাচ্ছি _internal

আমি $this->getRequest()->get('_route'). এমনকি নিয়ন্ত্রকের অভ্যন্তর থেকে রুটের নামটি পেয়েছি এমনকি কোডটি টেক্সডো 25 প্রস্তাবিত রিটার্ন দেয়_internal

এই কোডটি সিমফোনি 1. এক্স-তে 'উপাদান' বলা হয়ে কার্যকর করা হয়; কোনও পৃষ্ঠার নিয়ামক নয় তবে একটি পৃষ্ঠার অংশ যাতে কিছু যুক্তি প্রয়োজন।

সিমফনি ১. এক্স এর সমমানের কোডটি হ'ল: sfContext::getInstance()->getRouting()->getCurrentRouteName();


2
নিজেই সমাধান করেছেন। একটি দৃষ্টিতে:$view['request']->getParameter('_route');
অ্যালেক্সিজোরিন

5
এটি কারণ আপনি {% render... %}কলগুলি ব্যবহার করছেন standalone=true_internalস্বতন্ত্রভাবে ক্যাশেযোগ্য হওয়ার জন্য ক্যাচিংয়ের সাথে (অ্যাপক্যাশ.এফপি বা ইএসআই সহ বার্নিশ) সক্ষম হয়ে পৃথক এইচটিটিপি-রিকোয়েস্টের (এটি যেখানে এই পথটি কার্যকর হয়) দিয়ে স্বতন্ত্র মতামতের জন্য অনুরোধ জানাবে।
মার্টিন শোহফুß

2

সিমফনি ৩.৩ দিয়ে আমি এই পদ্ধতিটি ব্যবহার করেছি এবং ভাল কাজ করছি।

আমার মতো 4 টি রুট রয়েছে

প্রশাসক_শ্রেণী_পরিচালনা, প্রশাসক_শ্রেণী_ডিটেল, প্রশাসক_শ্রেণী_ক্রেট

এবং মাত্র একটি লাইন সমস্ত রুটের জন্য একটি সক্রিয় শ্রেণি তৈরি করে।

<li  {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}>
 <a href="{{ path('admin_category_index') }}">Product Categoires</a>
</li>

1

ইউআরএল ভিত্তিক বর্তমান রুট পেতে (ফরোয়ার্ড ক্ষেত্রে আরও নির্ভরযোগ্য):

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

সিমফনি ৪.২..7 এর সাহায্যে আমি আমার টুইগ টেম্পলেটটিতে নিম্নলিখিতগুলি প্রয়োগ করতে সক্ষম হয়েছি, যা আমার নিয়ামক (গুলি) এ সংজ্ঞায়িত কাস্টম রুটের নামটি প্রদর্শন করে।

ইনডেক্স। 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() {
        ...
        }

        ...
     }

ফলাফলটি আমার ব্রাউজারে পছন্দসই পৃষ্ঠায় "নিবন্ধ_লিস্ট" মুদ্রণ করে।


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
এটি পরিচালিত রুটের নামটি ফিরিয়ে দেবে না
নিকো হাজেস

@ নিকোহেস এটি রকেট বিজ্ঞান নয়, আপনার কাছে ইতিমধ্যে অনুরোধের বিষয়টি রয়েছে
আডেরেমি দিও

-2

আপনি যদি অনুরোধটি ইনজেক্ট করার চেয়ে আপনার নিয়ামকটিতে রুটের নাম পেতে চান ( সিমফনি ইউপগ্রিডের কারণে ধারক থেকে আসার পরিবর্তে এবং কল গেট ('_ রুট') থেকে)।

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
ricko Zoe
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.