2012-04-10 55 views
3

標題可能會令人困惑,但這裏是用代碼解釋。Yii - 從另一個動作方法調用動作方法

根據一些條件, 即使用戶撥打actionIndex,我也可以撥打actionContact

解決方案:1

public function actionIndex() 
    { 
     $a = 5; 
     if($a == 5){ 


$this->actionContact(); 
     } 
     else{ 
      $this->render('index'); 
     } 
    } 

    public function actionContact() 
    { 
     // Some codes 
     $this->render('contact'); 
    } 

解決方案:2

public function actionIndex() 
     { 
      $a = 5; 
      if($a == 5){ 


// Repeat code from actionContact method 
      $this->render('contact'); 
     } 
     else{ 
      $this->render('index'); 
     } 
    } 

解決方案:3我可以重定向到聯繫的URL。

我認爲,解決方案1對我來說工作得很好,我寧願那樣做。 但是因爲我是yii的新手,我想知道,如果它的路要走?

回答

3

「重複代碼」很少是正確的答案。重定向涉及額外的開銷,並且在我看來,它們主要應用於響應POST操作,而不是像這樣。在這種情況下,我會去與解決方案1.

+0

我同意,但這是標準的方式或者有其他選擇嗎? – Jashwant 2012-04-10 07:22:57

3

你可以使用一個第四個選項,這是重構的部分是共同的指標和接觸行動納入第三種方法:

public function common() { 
    // ... 
} 

public function actionIndex() { 
    // ... call $this->common() 
} 

public function actionContact() { 
    // ... call $this->common() 
} 

最好的選擇取決於儘管如此,在你的特殊情況下。例如,當您決定必須調用其他操作時,是否也想渲染其視圖?

+0

所以,控制器內部的方法不是'特殊的'。它們只是基於用戶操作而具有特定名稱的方法? – Jashwant 2012-04-10 07:24:55

+1

如果他們以「行動」開始,那麼他們是特殊的。因爲你可以通過一個url來呼叫他們。否則你可以有任何舊的方法名稱,並且你不能從URL調用它 – 2012-04-10 07:32:12

+0

@NeilMcGuigan,不,我正在考慮是否有任何變量在這些特殊方法的範圍內(並且僅限於那些名稱以'行動「 – Jashwant 2012-04-10 07:34:33

9

如果它不是問題,你可以使用向前

http://www.yiiframework.com/doc/api/1.1/CController#forward-detail

public function actionIndex() 
{ 
    $a = 5; 
    if($a == 5){ 
     // Forward user to action "contact" 
     $this->forward('contact'); 
    } 
    else{ 
     $this->render('index'); 
    } 
} 

public function actionContact() 
{ 
    // Some codes 
    $this->render('contact'); 
} 
+0

我想這是標準的方法。如果我是對的,我也可以將請求轉發給另一個控制器的操作方法。我對嗎 ?。我已經將其他問題標記爲答案,所以+1。 – Jashwant 2012-04-10 08:04:51

+0

是的,它的yii-way :)但我發現很難給它定製參數,但對於你的問題沒關係。 – 2012-04-10 16:41:27

+0

對不起,沒有回答你的問題。是的,你可以轉發它到另一個控制器的行動:) – 2012-04-10 16:42:58

相關問題