2013-05-19 4 views
3

나는 Yii 이벤트의 유연성에 깊은 인상을 받았습니다. 저는 Yii를 처음 접했고 Yii 이벤트 핸들러에 매개 변수를 전달하는 방법을 알고 싶습니다.yii에서 이벤트 처리기에 매개 변수를 전달하는 방법은 무엇입니까?

//i have onLogin event defined in the login model 
public function onLogin($event) 
{ 
    $this->raiseEvent("onLogin", $event); 
} 

핸들러 클래스에 로그인 핸들러가 정의되어 있습니다. 이 이벤트 핸들러 방법은 매개 변수를 취합니다

function loginHandler($param1) 
{ 
    ... 
} 

를하지만 여기, 나는 로그인 이벤트 핸들러에 매개 변수를 전달하는 방법에 관한 혼란 스러워요 :

//i attach login handler like this. 
$loginModel->onLogin = array("handlers", "loginHandler"); 
$e = new CEvent($this); 
$loginModel->onLogin($e); 

내가 뭔가 잘못하고 있습니까? 이것에 대한 또 다른 접근법이 있습니까? 당신은 당신의 설정 파일에 다음 행을 추가하여 그것을 할 수 onEndRequest onBeginRequest을 사용하려는 경우

답변

3

이제 내 질문에 대한 답을 얻었습니다. CEvent 클래스에는 매개 변수이라는 공용 속성이 있으며 여기에서 이벤트 처리기로 전달하는 동안 추가 데이터를 추가 할 수 있습니다.

//while creating new instance of an event I could do this 
$params = array("name" => "My Name"); 
$e = new CEvent($this, $params); 
$loginModel->onLogin($e); 

//adding second parameter will allow me to add data which can be accessed in 
// event handler function. loginHandler in this case. 
function loginHandler($event)// now I have an event parameter. 
{ 
    echo $event->params['name']; //will print : "My Name" 

} 
1

:

return array ( 
'onBeginRequest'=>array('Y', 'getStats'), 
'onEndRequest'=>array('Y', 'writeStats'), 
) 

또는 당신은 모든 요청에 ​​따라서 그것을 인라인

Yii::app()->onBeginRequest= array('Y', 'getStats'); 
Yii::app()->onEndRequest= array('Y', 'writeStats');`class Y { 
public function getStats ($event) { 
    // Here you put all needed code to start stats collection 
} 
public function writeStats ($event) { 
    // Here you put all needed code to save collected stats 
} 
}` 

을 수행 할 수 있습니다 두 가지 방법 모두 자동으로 실행됩니다. 물론 "왜 BeginRequest 메소드에 과부하가 걸리는 것일까?"라고 생각할 수 있습니다. 하지만 우선 모든 이벤트는 반복되는 코드를 실행하도록 클래스를 확장하지 못하게하고 다른 위치에서 선언 된 다른 클래스의 다른 메소드를 실행할 수있게합니다. 그래서 당신은 이전 이벤트 핸들러를 사용하여 응용 프로그램을 따라의 다른 부분에서

Yii::app()->onEndRequest= array('YClass', 'someMethod'); 

을 추가 할 수 있으며 얻을 요청 처리 후 Y->writeStatsYClass->someMethod 모두를 실행합니다. 이 동작을 통해 소스 코드를 변경하지 않고 Yii의 기본 클래스를 확장하지 않고도 거의 모든 복잡성의 확장 구성 요소를 만들 수 있습니다.

+1

이벤트에 대한 답변은 좋지만 매개 변수는 어떻게 전달됩니까? 문제의 방법이 괜찮은 것 같습니다. 하나 더 추가하려면 값을 이벤트로 전달하는 방법이 있습니다 : 이벤트 처리기에서'$ event-> sender'를 사용하면 CEvent 생성자 param이 반환됩니다. –

+0

질문에 대답하지 않습니다. –

관련 문제