2014-09-06 6 views
12

का उपयोग कर आप कहते हैं निम्नलिखित नियंत्रक संरचनाYii2 मार्ग जब केमलकेस कार्रवाई नामों

<?php 
namespace app\controllers; 

use Yii; 
use yii\web\Controller; 
/** 
* Test controller 
*/ 
class TestController extends Controller 
{ 
    public function actionMyaction(){ 
     ... 
     //action logic 
    } 

    public function actionMyAction(){ 
     ... 
     //action logic 
    } 
} 

पहले मार्ग पथ का उपयोग example.com/test/myaction

प्रति Yii 1.x तर्क दूसरा मार्ग होना चाहिए पहुँचा जा सकता है है, तो पथ example.com/test/myAction Yii2.x मार्ग में से सुलभ हाइफन संरचना का उपयोग और केवल example.com/test/my-action

से पहुँचा जा सकता है कर रहा है वहाँ है वैसे भी CamelCase का उपयोग कर मार्ग को सक्षम करने के रूटिंग कक्षाओं के विस्तार के बिना वाईआई 2 में संरचना?

यह महत्वपूर्ण है क्योंकि यह सभी लिंक (जो बिल्कुल इंटरनेट पर हैं) पिछड़ा संगतता तोड़ता है और इस प्रकार Yii1.x ऐप को Yii2.x पर माइग्रेट नहीं किया जा सकता है भले ही कोड पूरी तरह से लिखा गया हो। इस परिवर्तन का कारण क्या था?

उत्तर

13

मुझे इस बदलाव के बारे में थोड़ा फेंक दिया गया था, लेकिन आखिर में मैंने पाया कि यह यूआरएल को पढ़ने में आसान बनाता है। मैं Yii1 में केस संवेदनशील मार्ग होने के बारे में अनिश्चित था, Yii2 में मुझे इस समस्या (या किसी समस्या का प्रभाव) नहीं है।

मुझे सटीक कारण के बारे में निश्चित नहीं है, लेकिन मैं आपको बता सकता हूं कि एसईओ के लिए यह बेहतर है - 1 बड़ा शब्द रखने के बजाय शब्दों को अलग करना।

जब मैं yii2 में एक एप्लिकेशन को फिर से लिखता हूं, तो मैंने यूआरएल प्रबंधक को उन पुराने मार्गों में डाल दिया जिन्हें मुझे बनाए रखने की आवश्यकता है।

 'urlManager' => [ 
      'class' => 'yii\web\UrlManager', 
      'enablePrettyUrl' => true, 
      'showScriptName' => false, 
      'rules' => [ 
................................................. 
       'site/registerInterest' => 'site/register-interest', 
................................................. 

      ], 
     ], 

तो मेरे पुराने लिंक अब ठीक काम करते हैं। यदि आप पुराने मार्गों से एसईओ रस रखने के लिए नए लोगों से चाहते हैं तो आप .htaccess में 301 रीडायरेक्ट भी डाल सकते हैं।

+1

धन्यवाद Mikhai, एसईओ बनाता है भावना पुराने प्रोजेक्ट में कार्यों के सैकड़ों देखते हैं, मैन्युअल रूप से हर रीरूटिंग एक ऐसा लगता है कि एक रेगेक्स आधारित समाधान क्यूबर्सोम संभव है? – Manquer

+0

आप 1 कस्टम यूआरएल मैनेजर http://www.yiiframework.com/doc-2.0/guide-runtime-url-handling.html#creating-your-own-rule-classes लिख सकते हैं जो उन सभी पर शासन कर सकते हैं :)। मैंने व्यक्तिगत रूप से एक नहीं लिखा क्योंकि मेरी परियोजना को आसानी से संभालना था, सार्वजनिक हिस्सा इतना बड़ा नहीं है और व्यवस्थापक मुझे वास्तव में एसईओ की परवाह नहीं करता है। –

3

आप अपनी खुद की Basecontroller बनाने के लिए और एक पैटर्न के साथ createAction अधिलेखित कर सकते हैं अनुमति देते हैं अपरकेस तरह

preg_match('/^[a-zA-Z0-9\\-_]

public function createAction($id) 
{ 
    if ($id === '') { 
     $id = $this->defaultAction; 
    } 

    $actionMap = $this->actions(); 
    if (isset($actionMap[$id])) { 
     return Yii::createObject($actionMap[$id], [$id, $this]); 
    } elseif (preg_match('/^[a-zA-Z0-9\\-_]+$/', $id) && strpos($id, '--') === false && trim($id, '-') === $id) { 
     $methodName = 'action' . str_replace(' ', '', ucwords(implode(' ', explode('-', $id)))); 
     if (method_exists($this, $methodName)) { 
      $method = new \ReflectionMethod($this, $methodName); 
      if ($method->isPublic() && $method->getName() === $methodName) { 
       return new InlineAction($id, $this, $methodName); 
      } 
     } 
    } 

    return null; 
}