2013-03-12 112 views
1

我搜索了,但沒有找到一些東西。 所以,我的路由規則:Yii框架 - 從URL到路由

... 

'/reg' => '/user/user/registration', 
... 

Yii::app()->request 

我不能找到任何路由信息。

所以,我怎樣才能在模塊初始化函數,並具有唯一的網址,路線LILE

/reg -> user/user/registration 

UPD

+0

顯示所有航線:them depe發現他們的訂單。 – sensorario 2013-03-12 21:57:37

+0

這是錯誤的答案。我發現這樣做的唯一方法是重寫getPathInfo(),getRequestUri(),protected $ _requestUri;和$ _pathInfo;在子類中: ''' class HttpRequest extends CHttpRequest { \t protected $ _requestUri; \t protected $ _pathInfo; \t public function setUri($ uri){ \t \t $ this - > _ requestUri = $ uri; \t} \t公共函數setPathInfo($路線){ \t \t $這 - > _ PATHINFO = $路線; \t} \t公共職能getPathInfo(){/ *從 \t公共職能getRequestUri(){/ *從母公司* /} ''' – alexglue 2015-05-21 11:55:31

+0

副本可你在解釋你的答案母公司* /}複製「回答問題「模式@alexglue? – Miroff 2015-06-23 13:45:08

回答

0

今天(我的問題後的第二天),我可以解決這個問題。

我會盡量解釋:

正如邁克爾寫道,我們不能在模塊中的哪個控制器,我們知道。

但是我的網絡只是反轉路線,所以,它相當好。

Yii::app()->getUrlManager()->parseUrl('/reg'); 

這將返回我的反向航線

user/user/registration 

parseUrl

0

路由只能從正在運行的控制器。當模塊初始化時,控制器尚不可用,因此您無法找到該路線。 (您可以按照CWebApplication::processRequest查看當請求解析到控制器運行時發生的情況。)

這取決於您嘗試實現的目標,但您可以覆蓋WebModule::beforeControllerAction以在模塊控制器之前執行某些操作運行。

+0

很抱歉,我更正了我的問題 – Miroff 2013-03-12 14:01:42

+0

現在我明白了。答案已更新。 – 2013-03-12 14:24:01

+0

我找到了答案! – Miroff 2013-03-13 05:18:58

0

解決方案的Yii 1.1.15 workes我。

class HttpRequest extends CHttpRequest { 

    protected $_requestUri; 
    protected $_pathInfo; 

    public function setUri($uri){ 
     $this->_requestUri = $uri; 
    } 

    public function setPathInfo($route){ 
     $this->_pathInfo = $route; 
    } 

    public function getPathInfo(){ 
     /* copy from parent */ 
    } 

    public function getRequestUri(){ 
     /* copy from parent */ 
    } 
} 

用法:

$uri_path = 'my/project-alias/wall'; 

    /** @var HttpRequest $request */ 
    $request = clone Yii::app()->getRequest(); 
    $request->setUri($uri_path); 
    $request->setPathInfo(null); 

    $route = Yii::app()->getUrlManager()->parseUrl($request); 

    //$route equals 'project/profile/wall' etc here (like in route rules); 
+0

我認爲,這個解決方案更難。爲什麼你不喜歡我找到的解決方案? (它工作正常) – Miroff 2015-06-25 08:42:25

+0

@Miroff導致它不適用於Yii 1.1.5:我得到了「致命錯誤:調用成員函數getPathInfo()在/ vendor/yiisoft/yii/framework/web /第364行的CUrlManager.php「在字符串''$ rawPathInfo = $ request-> getPathInfo();'''因爲$ request應該是一個具有設計保護的$ pathInfo等的對象。 – alexglue 2015-06-25 11:36:23

+0

哦謝謝。我測試了它。 – Miroff 2015-12-02 21:59:47

0

我使用了一個稍微不同的子類CHttpRequest的:

class CustomHttpRequest extends \CHttpRequest 
{ 
    /** 
    * @var string 
    */ 
    var $pathInfo; 
    /** 
    * @var string 
    */ 
    private $method; 

    public function __construct($pathInfo, $method) 
    { 
     $this->pathInfo = $pathInfo; 
     $this->method = $method; 
    } 

    public function getPathInfo() 
    { 
     return $this->pathInfo; // Return our path info rather than the default 
    } 

    public function getRequestType() 
    { 
     return $this->method; 
    } 
} 

然後調用它(創建一個控制器,這是什麼我想要):

$request = new CustomHttpRequest($uri, $method); // e.g. 'my/project-alias/wall' and 'GET' 
$route = \Yii::app()->getUrlManager()->parseUrl($request); 
list($jcontroller, $actionName) = \Yii::app()->createController($route); 
+0

這個解決方案適用於yii2嗎? – Miroff 2015-12-02 22:00:05