2012-04-10 3 views
3

Название может быть запутанным, но вот объяснение с кодом.Yii - вызов метода действия из другого метода действий

Исходя из некоторых условий, Я могу позвонить actionContact, даже если пользователь позвонил actionIndex.

Решение: 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

3

Вы можете использовать четвертый вариант, который рефакторинг части, которая является общей для индексации и контактных действий в третий метод:

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

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

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

Лучший вариант зависит на ваш конкретный случай. Например, когда вы решаете, что вам нужно вызвать другое действие, вы тоже хотите отобразить его представление?

+0

Итак, методы внутри контроллера не являются «специальными». Это просто методы с конкретными именами, основанные на действиях пользователя? – Jashwant

+1

, если они начинаются с «действия», они являются особыми. в том, что вы можете позвонить им через URL-адрес. в противном случае у вас может быть любое старое имя метода, и вы не можете называть его по URL-адресу –

+0

@NeilMcGuigan. Нет, я думаю, доступна ли какая-либо переменная в рамках этих специальных методов (и только для тех), имя которых начинается с ' action ' – Jashwant

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

+0

Да, его yii-way :), но мне было трудно дать ему настраиваемые параметры, но для вашей проблемы все в порядке. –

+0

извините, не ответил на ваш вопрос. Да, вы можете перенаправить его на другое действие контроллера :) –

Смежные вопросы