2012-05-23 93 views
1

我想從控制器調用另一個控制器中的函數。
從Yii中的控制器調用另一個控制器中的函數

class FirstController extends Controller { 
     public function test1() { return 'OK'; } 
} 
class SecondController extends Controller { 
     public function callTest1() { First::test1(); } 
} 

- >服務器錯誤
幫助我解決這個問題。

回答

8

您不能直接調用該方法,因爲它不是static,所以您必須先創建FirstController的實例。當你想要做的是,用CWebApplication::createController

// supply appropriate route in place of 'first/index' 
list($first) = Yii::app()->createController('first/index'); 
$first->test1(); 

但是,不應該有必要從另一個調用控制器方法;這是一種不好的代碼味道。也許將代碼重構並將其從控制器中拉出(更適合模型)會更合適。

+0

我這樣做,但它仍然錯誤。如果我們需要處理在另一個控制器的函數中被刪除的內容,我們應該如何處理[在當前控制器中],而不需要另一個控制器的調用功能。你能告訴我該怎麼做,改變我的僵硬的想法。非常感謝你 –

+1

@HuyTran:不是沒有更多的信息,對不起。 – Jon

+0

@HuyTran,你可以添加components/controller.php方法將從第二/索引和first/index調用 – Sergey

0

您不能直接調用函數:首先創建控制器的實例,然後調用函數:

$process = Yii::app()->createController('FirstController'); //create instance of controller 

$process->test1(); //call function 
0

如果方法test1FirstController沒有使用$this你可以簡單地讓它static。相反的:

public function test1() { return 'OK'; } 

標誌它:

public static function test1() { return 'OK'; } 

然後你就可以與其他地方調用它:

FirstController::test1(); 

這一切都取決於你的需求...

1

的在調用createController()時不應該使用字'Controller',並且在調用函數之前應該使用結果的[0]元素

$process = Yii::app()->createController('First'); //create instance of FirstController 
$process=$process[0]; 
$process->test1(); //call function 
1

您還可以使用Yii::$app->runAction()

相關問題