2012-05-23 5 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

그래도 그래도 오류가 발생합니다. 다른 컨트롤러의 기능에서 해제 된 것을 처리해야하는 경우 다른 컨트롤러의 호출 기능없이 [현재 컨트롤러에서] 처리하려면 어떻게해야합니까? 내 딱딱한 마음을 바꾸기 위해 더 잘할 수있는 것을 보여줄 수 있습니까? 너무 많이 u 고마워요 –

+1

@HuyTran : 더 많은 정보없이, 미안 해요. – Jon

+0

@HuyTran, 컴포넌트/controller.php 메소드를 추가 할 수 있습니다. 마녀는 두 번째/색인 및 첫 번째/색인에서 호출합니다. – Sergey

0

당신은 직접 함수를 호출 할 수 있습니다 : 첫 번째 컨트롤러의 인스턴스를 만든 다음 함수를 호출 :

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

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

당신의 $this를 사용하지 않는 FirstController의 방법 test1 당신이 단순히 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()을 사용할 수도 있습니다.

관련 문제