2012-02-03 88 views
2

如果你在這個鏈接http://www.yiiframework.com/doc/guide/1.1/en/basics.controller的#3下查看,它可以讓你將所有的控制器函數組織成單個的php文件。在Yii中正確實現runWithParams()

要做到這一點,你必須讓每個php文件包含一個擴展CAction的類。每個類必須在run()函數內部有其運行代碼。

這是我UserController.php文件

public function actions() 
{ 
    $FOLDER = '.User'; 
    $PROJECT_ROOT = 'application.controllers' . $FOLDER; 

    return array (
     'list' => $PROJECT_ROOT . 'ListAction', 
); 

}

在,我寫我需要將變量傳遞給特定的操作應用。

Yii在Yii 1.7中實現了runWithParams($ params)來允許這種情況發生。然而,當我調用(例如)DeleteAction.php文件runWithParams($ params)而不是run()並且我們的前端調用post/delete /?params = 45而不是run()時,我寫了一個錯誤, 「在文件中找不到的run()DeleteAction.php

class ListAction extends CAction 
{ 
public function runWithParam($id) 
{ 
    SiteController::actionLoggedin(); 
    $id = addslashes($id); 
} 

這意味着我需要運行()...但我不能把參數傳遞的run()。我需要runWithParams($ params)方法。

在該函數runWithParams的文檔($ params)方法 http://www.yiiframework.com/doc/api/1.1/CAction#runWithParams-detail

它說

Runs the action with the supplied request parameters. This method is internally called by CController::runAction(). 

我很困惑這是什麼意思?我不明白我如何能夠成功實現這一點。

+0

你能提供什麼你正在嘗試做一個代碼示例?這個問題令人困惑,謝謝。 – thaddeusmt 2012-02-04 15:25:59

+0

我編輯的帖子,使其成爲一個適當的問題,而不只是一個混亂的blurb。看看你是否有機會。 – Schwoebel 2012-02-04 19:41:08

回答

4

你只需要在CAction類中實現run()

您將自動獲得訪問$ _GET參數,可以當然,就像你在你的行動通常會:

class ListAction extends CAction { 
    public function run() { 
    $id = $_GET['id']; // $_POST works too 
    $model = Model::model()->findbyPk($id); 
    // render your view next, whatever 
    } 
} 

如果你想從控制器額外的常量傳遞給CAction,你可以在您的控制器

在動作設置:做這樣的

public function actions() { 
    return array(
    'userSearch'=>array(
     'class'=>'application.controllers.User.ListAction', // path alias to your action 
     'model'=>'User', 
     'otherVariable'=>'something here', 
)); 
} 
在CAction

然後:

class ListAction extends CAction { 
    public $modelName; 
    public $otherVariable; 
    public function run() { 
    $this->modelName; // 'User' - passed in from the calling Controller 
    $this->otherVariable; // 'something here' - passed in from the calling Controller 
    } 
} 

我不確定還有哪些其他參數可能要傳遞給您的操作,但應該覆蓋它。我希望這有助於!

更新:

這個問題已經讓我看看更深入的代碼,這實際上是所有的Yii的功能,我不知道的事情。如果你在動作中聲明瞭一個參數(即function actionTest($param)),那麼Yii將解析請求的$ _GET參數,並用傳入該函數的那個​​參數調用Action。所以你不必親自獲取$ _GET參數。像這樣:

http://example.com/mycontroller/myaction?param1=test 

function actionMyaction($param1) { // in a CAction, it would be run($param1) 
    echo '$_GET parameter param1 set to '.$param1; // will echo "test" 
} 

,這是實現的方式是:

  1. runAction() CController得到$ _GET參數(如果有的話)與getActionParams()
  2. runAction()這些參數傳遞到runWithParams()
  3. runWithParams()使用PHP反射查看動作方法是否有參數(例如$param1
    1. 如果有參數,它調用runWithParamsInternal()與$ _GET參數
      1. runWithParamsInternal()調用run()方法使用$ _GET的參數(例如run($param1)
    2. 否則,它只是調用run()不帶任何參數

這是完全可選的使用這個,你仍然可以訪問您的行動$ _GET參數,如不正常。基本上,這只是執行所需的$ _GET參數。如果您的操作需要參數,但請求URL中沒有$ _GET參數,Yii會從invalidActionParams()返回一個「錯誤400」。它可以爲你節省檢查isset($_GET)的負擔,這很酷。

+0

就是這樣,先生。我期待runWithParams()成爲run()的替代品。而模型和其他變量的額外部分是我不知道的。謝謝先生,+++++! – Schwoebel 2012-02-05 10:01:22

+0

我一整天都在想這件事,雖然我確實認爲這是一種實現runWithParams的方法,但似乎我不應該在run()中調用它,因爲爲什麼還要打擾runWithParams呢?如果你要調用run(),從post,get,session(或其他)收集變量並調用runWithParams,你可以在run()中輕鬆運行你自己的函數,並且完全忽略runWithParams($ p)。似乎有更深層的東西可以防止需要先執行run()。 – Schwoebel 2012-02-05 19:49:04

+0

我*想*我想通了。我想你只是調用CController :: runAction()INSIDE運行並且運行runWithParams()。這將爲您節省收集變量的任務。 – Schwoebel 2012-02-05 20:06:53

0

從相同的Yii引導你在你的描述指出:

從1.1.7版本開始,自動參數還結合工作 爲基於類的動作。當動作類的run()方法是用某些參數定義的 時,它們將填充相應的命名請求參數值 。例如,

class UpdateAction extends CAction 
{ 
    public function run($id) 
    { 
     // $id will be populated with $_GET['id'] 
    } 
} 

一樣簡單這一點。在run()中定義你需要的所有參數。

當然,你可以隨時獲得了$ _GET [ '關鍵']或者被Yii ::應用程序() - >請求 - > getQuery( '鍵')

如果您在運行添加它們,知道如果你不總是要通過所有的參數,你可以設置默認值,否則你會得到錯誤。

例子:

public function run($id, $other_param='default_value')