2016-06-30 5 views
5

मैं वाईआई 2 के साथ काम कर रहा हूं और मैं सभी गैर-अक्षर और गैर-संख्या वाले अक्षरों को स्लेश में बदलने के लिए रूटिंग के साथ urlManager का उपयोग करना चाहता हूं। मैंने पहले से ही पूछा गया है कि बहुत से सवाल पूछा गया है (#1, #2, #3, #4) लेकिन कोई भी इसे हल नहीं करता क्योंकि वे या तो थोड़ा समान दिखाते हैं, लेकिन जो भी मैं चाहता हूं या मेरे लिए काम नहीं कर रहा हूं।वाईआई 2 सुंदर यूआरएल: स्लैश के साथ सब कुछ स्वचालित रूप से कनवर्ट करें (सभी पैरामीटर समेत)

//... 
'urlManager' => [ 
    'class' => 'yii\web\UrlManager', 
    'enablePrettyUrl' => true, 
    'showScriptName' => false, 
    'rules' => array(
     '<controller:\w+>/<id:\d+>' => '<controller>/view', 
     '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>', 
     '<controller:\w+>/<action:\w+>' => '<controller>/<action>', 
    ), 
], 

.htaccess (यह भी सरल):

मैं सरल urlManager नियम है

localhost/frontend/web/index.php?r=site%2Ftest-router&ident=10&token=ADB&module=P120

:

RewriteEngine on 
# If a directory or a file exists, use it directly 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
# Otherwise forward it to index.php 
RewriteRule . index.php 

मेरे मामले में, मेरा बदसूरत URL ऐसा (SiteController -> public function actionTestRouter()) है

नियमों के साथ मैंने ऊपर लिखा है, मुझे बेहतर परिणाम मिलता है (क्योंकि यह index.php?r= और रूपांतरणों को हटा देता है क्या मैं प्राप्त करना चाहते हैं

localhost/frontend/web/site/test-router?ident=10&token=ADB&module=P120

: %2F/ करने के लिए) के नियमों के साथ

localhost/frontend/web/site/test-router/ident/10/token/ADB/module/P120

मेरे कई attemps थे:

'test-route/<ident:\d+>/<token:\w+>/<module:\w+>' => 'test-route' // 1 
'<controller:\w+>/<action:\w+>/<ident:\d+>/<token:\w+>/<module:\w+>' => '<controller>/<action>' // 2 
'<controller:\w+>/<action:\w+>/<slug:[a-zA-Z0-9_-]+>/' => '<controller>/<action>/<slug>' // 3 (not even sure what slug does here 

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

उत्तर

5

आपका दूसरा प्रयास

'<controller:[\w\-]+>/<action:[\w\-]+>/<ident:\d+>/<token:\w+>/<module:\w+>' => '<controller>/<action>' // 2 

ले/बनाएगा यूआरएल

localhost/frontend/web/site/test-router/10/ADB/P120

URL में पैरामीटर के नाम के बिना और इन पैरामीटर इस क्रम में ही इस्तेमाल किया जाएगा और जैसा कि आप देख अपनी सूची तय हो गई है

यदि आप यूआरएल में अपने नाम जोड़ना चाहते हैं (आपके प्रश्न में एसेटिक या एसईओ उद्देश्यों के लिए):

इन मार्गों के लिए
'<controller:[\w\-]+>/<action:[\w\-]+>/ident/<ident:\d+>/token/<token:\w+>/module/<module:\w+>' => '<controller>/<action>', // 2 

और यूआरएल सृजन ही होगा:

echo Url::to(['site/test-router', 'ident' => 100, 'module' => 100, 'token' => 100]); 

आप पैरामीटर की इस सूची के विभिन्न लंबाई पार्स चाहते हैं, तो आप इस तरह ख़ाली उपयोग कर सकते हैं:

'<controller:[\w\-]+>/<action:[\w\-]+>/<params:[a-zA-Z0-9_\-\/]+>' => '<controller>/<action>' 

या निर्दिष्ट यह केवल एक मार्ग के लिए:

'site/test-route/<params:[a-zA-Z0-9_\-\/]+>' => 'site/test-route' 

तो कार्रवाई में आप पैरामीटर params मिल जाएगा: Yii::$app->request->get('params'); regexp के साथ इसे पार्स करें।

+0

उत्तर के लिए धन्यवाद। लेकिन मुझे यह त्रुटि मिली: 'preg_match(): संकलन विफल: आखिरी या दूसरे-अंतिम विकल्पों को आजमाते समय वर्ण वर्ग में ऑफसेट 66 में ऑर्डर से बाहर है। :/ –

+0

आह से कम से कम 5.2 मिनट भी बच जाना चाहिए। उत्तर संपादित किया गया। – user1852788

+0

मुझे अभी भी यह सही नहीं लगता है।:/मैंने आपके संपादन की कोशिश की और 'लोकलहोस्ट/फ्रंटएंड/वेब/साइट/टेस्ट-राउटर/पहचान/10/टोकन/एडीबी/मॉड्यूल/पी 120' (सीधे यूआरएल में) दर्ज किया लेकिन मुझे '404' त्रुटि मिली। –

संबंधित मुद्दे