2011-02-09 10 views
24

Symfony2 में डिफ़ॉल्ट रूटिंग कैसे सेट करें?Symfony2 में रूटिंग

homepage: 
    url: /
    param: { module: default, action: index } 

default_symfony: 
    url: /symfony/:action/... 
    param: { module: default } 

default_index: 
    url: /:module 
    param: { action: index } 

default: 
    url: /:module/:action/... 

उत्तर

3

यहाँ एक उदाहरण है: http://docs.symfony-reloaded.org/master/quick_tour/the_big_picture.html#routing

एक मार्ग परिभाषा केवल एक अनिवार्य पैरामीटर pattern और तीन optionals पैरामीटर defaults, requirements और options है

Symfony1 में यह कुछ इस तरह देखा।

video: 
    pattern: /watch/{id}/{slug} 
    defaults: { _controller: SiteBundle:Video:watch } 
    requirements: { id: "\d+", slug: "[\w-]+" 
+1

मुझे पता है कि मेरे मार्ग में पैरामीटर कैसे जोड़ें। लेकिन मैं नियंत्रक और कार्रवाई से मिलान करना चाहता हूं जैसे कि नियंत्रक/एक्शन/पैराम्स ... – umpirsky

8

मैं इसे मानक रूटिंग घटक के साथ संभव है नहीं लगता है:

यहाँ मेरी अपनी परियोजना से एक मार्ग है। इस बंडल की एक नजर डालें, यह मदद कर सकता है: https://github.com/hidenorigoto/DefaultRouteBundle

+1

एनोटेशन के साथ ऐसा करना एक और तरीका है http://bundles.symfony-reloaded.org/frameworkextrabundle/#annotations-for-controllers अभी भी कोई डिफ़ॉल्ट मार्ग नहीं है। – umpirsky

+0

नहीं, यह संभव है। नीचे जवाब देखें। –

2

वैकल्पिक रूप से, आप सीधे नियंत्रक फ़ाइल में @ रूट एनोटेशन का उपयोग कर सकते हैं। देखें https://github.com/sensio/SensioFrameworkExtraBundle/blob/master/Resources/doc/annotations/routing.rst

डिफ़ॉल्ट मार्गों के लिए, मुझे लगता है कि Symfony2 स्पष्ट मार्ग मैपिंग को प्रोत्साहित करता है।

+0

मुझे लगता है कि अजीब बात यह है कि यदि आप कंसोल टूल का उपयोग करके अपना बंडल जेनरेट करते हैं, तो यह एनोटेशन के माध्यम से परिभाषित रूटिंग के साथ एक डिफ़ॉल्ट नियंत्रक बनाता है। लेकिन आधिकारिक पुस्तक एनोटेशन के माध्यम से रूटिंग का कोई जिक्र नहीं करती - पुस्तक में कोई उल्लेख नहीं है। यदि यह डिफ़ॉल्ट सेटअप है, तो मुझे लगता है कि इसे इंगित किया जाना चाहिए और दस्तावेज (या इसके लिंक) प्रदान किए जाने चाहिए। – Eno

1

आप अपना स्वयं का बंडल बना सकते हैं जो नियंत्रक की अगली विधि को पास करने के लिए स्ट्रिंग बनाने के लिए सभी अनुरोधों और यूआरएल पैरामीटरों को संभाला करता है। लेकिन यह बहुत गड़बड़ है, मैं अच्छी तरह से परिभाषित मार्गों के साथ जाऊंगा, यह आपके यूआरएल क्लीनर रखता है, और यूआरएल और नियंत्रक नाम decouples। यदि आप एक बंडल या कुछ नाम बदलते हैं, तो क्या आपको अपने यूआरएल को दोबारा बदलना होगा?

28

मैं इस के जवाब के लिए कुकबुक देख रहा था, और मुझे लगता है कि मुझे यह here मिला है। डिफ़ॉल्ट रूप से, सभी मार्ग पैरामीटर में एक छिपी आवश्यकता होती है कि वे किसी भी चरित्र से मेल खाते हैं/चरित्र ([^ /] +) को छोड़कर, लेकिन इस व्यवहार को किसी भी वर्ण से मिलान करने के लिए मजबूर कर, इसे आवश्यक कीवर्ड के साथ ओवरराइड किया जा सकता है।

निम्नलिखित को एक डिफ़ॉल्ट मार्ग बनाना चाहिए जो अन्य सभी को पकड़ लेता है - और इस तरह, आपके रूटिंग कॉन्फ़िगरेशन में अंतिम बार आना चाहिए, क्योंकि निम्न मार्ग कभी मैच नहीं होंगे। यह सुनिश्चित करने के लिए कि यह "/" से भी मेल खाता है, यूआरएल पैरामीटर के लिए एक डिफ़ॉल्ट मान शामिल है।

default_route: 
    pattern: /{url} 
    defaults: { _controller: AcmeBundle:Default:index, url: "index" } 
    requirements: 
     url: ".+" 
+0

कामयाब, चीयर्स लेकिन बस बढ़ाने के लिए: "डिफ़ॉल्ट" आपके नियंत्रक का वर्गनाम है (पहला अक्षर "नियंत्रक" भाग के बिना पूंजीकृत)। – domguinard

+0

इस उत्तर में प्रस्तुत कोड के साथ एक समस्या है, इसे एक रूट नाम की आवश्यकता है। वर्तमान में 'पैटर्न:' को रूट नाम और 'पैटर्न:', 'डिफ़ॉल्ट:' और 'आवश्यकताएं माना जाता है: 'उसी स्तर पर इंडेंट करने की आवश्यकता है। – Luke

+0

धन्यवाद, यह शायद मेरी मार्ग फ़ाइल से एक भीड़ प्रतिलिपि/पेस्ट नौकरी थी! – Longsight

2

एक डिफ़ॉल्ट मार्ग बनाएं प्रोग्रामिंग का एक अच्छा तरीका नहीं है। क्यूं कर? क्योंकि इस कारण से अपवाद लागू किया गया था। सिम्फनी 2 सही चीजों को सही तरीके से करने के लिए बनाया गया है।

यदि आप सभी "नहीं पाए गए" मार्गों को पुनर्निर्देशित करना चाहते हैं तो आपको अपवाद का उपयोग करना चाहिए, जैसे NotFound404 या कुछ समान। आप इस पृष्ठ को अपने आप भी अनुकूलित कर सकते हैं।

एक मार्ग एक उद्देश्य के लिए है। हमेशा। अन्य सोच बुरा है।

+2

बास्ता की टिप्पणी: "@ मर्क मोरेरा मेरिनो: इस उपयोग के मामले पर विचार करें - डिफ़ॉल्ट दृश्य वाला एक ब्लॉग, एकल पोस्ट व्यू, गेस्टबुक, गेस्टबुक एंट्री फॉर्म इत्यादि। डिफ़ॉल्ट दृश्य के लिए, मैं नहीं चाहता कि यूआरएल हो फॉर्म 'http: // example.com/blog/slug', लेकिन बस' http: // example.com/slug'। यह साइट का डिफ़ॉल्ट दृश्य होगा, और निश्चित रूप से कुछ भी नहीं जिसे 'अपवाद' के रूप में माना जा सकता है ' "। –

+0

साथ ही, यह पूरी तरह से उचित है कि आपका जेएस रूटिंग को संभालने और गतिशील रूप से एप्लिकेशन दृश्य को लोड करना चाहता है, इस मामले में सभी मार्ग बेस लेआउट की सेवा करेंगे और आपका जेएस राउटर यूआरएल निर्धारित करेगा और दृश्य प्रस्तुत करेगा। यह सभी मार्ग – JamesHalsall

+0

मार्क को पकड़ने के लिए कहता है, मुझे लगता है कि आपने एसईओ के बारे में नहीं सुना है, साइट को पुनर्गठन करते समय कभी-कभी रूट बदलना आवश्यक होता है और एक कैच-ऑल को सही रीडायरेक्ट (301 स्थिति) देने में सक्षम होने की आवश्यकता हो सकती है। – h00ligan

1

यदि आप "सभी को पकड़ें" बनाना चाहते हैं, तो आपकी सर्वश्रेष्ठ शर्त KernelEvents::EXCEPTION ईवेंट पर हुक होगी। जब भी एक अपवाद HttpKernel पर जाता है, तो यह घटना ट्रिगर हो जाती है, इसमें NotFoundHttpException फेंक दिया जाता है जब राउटर नियंत्रक के लिए मार्ग का समाधान नहीं कर सकता है।

प्रभाव सिम्फनी के स्टाइलिज्ड 404 पेज के समान होगा जो आपको app_dev.php के माध्यम से अनुरोध भेजते समय प्रदान किया जाता है। 404 लौटने के बजाय, आप जो भी तर्क खोज रहे हैं उसे निष्पादित करते हैं।

4

Symfony2 मानक रूटिंग घटक इसे समर्थन नहीं है, लेकिन इस बंडल की खाई Symfony1 छोड़ दिया भरता है:

https://github.com/LeaseWeb/LswDefaultRoutingBundle

यह आप क्या अपेक्षा करता है।

FosUserBundle: 
    resource: "@FosUserBundle" 
    prefix: /
    type:  default 

यह अपने बंडल को स्कैन करता है और स्वचालित रूप से अपने रूटर मेज पर मार्गों है कि आप को क्रियान्वित करते हुए डीबग कर सकते हैं कहते हैं:

app/console router:debug 

स्वचालित रूप से जोड़ डिफ़ॉल्ट मार्गों का उदाहरण आप इस सिंटैक्स का उपयोग एक बंडल मार्ग डिफ़ॉल्ट कर सकते हैं:

[router] Current routes 
Name       Method Pattern 
fos_user.user.login_check  ANY /user/login_check.{_format} 
fos_user.user.logout   ANY /user/logout.{_format} 
fos_user.user.login   ANY /user/login.{_format} 
... 

आप देखते हैं कि यह भी एक फ़ाइल एक्सटेंशन (एचटीएमएल, JSON या XML) का उपयोग करके स्वत: "प्रारूप" चयन का समर्थन करता है।