2014-10-31 4 views
2

는 과도하게 단순화 동작은 동작이 성공적으로 연결되어Yii2 : 동작이있는 컨트롤러에 연결된 동작을 참조하는 방법? 내가 몇 컨트롤러에 액션을 추가 할 행동을 사용하고

public class GreetBehavior extends Behavior { 
    public function sayHello() { 
     return "Hello" 
    } 

    public function actionGreet() { 
     return "Hello"; 
    } 
} 

으로 정의된다. 컨트롤러 (f.i. Person) 방법에서 $this->sayHello();으로 sayHello에 액세스 할 수 있습니다. 그러나 주소창에서 호출하면 actionGreet가 인식되지 않습니다 : ...index.php?r=person/greet. 그것은 해결할 수 없다는 메시지를줍니다. 액션을 가진 컨트롤러에 액션을 추가 할 수 있습니까? 그렇다면, 당신은 나에게 무엇을 할 것인지/내가 잘못하고있는 것에 대한 힌트를 줄 수 있습니까? 그렇지 않다면 대안을 알고 있습니까?

답변

2

컨트롤러에 액션을 추가하는 방법은 두 가지가 있습니다; 독립 실행 형 및 인라인 인라인 액션을 추가하려고합니다. 즉, 'action'접두사가있는 컨트롤러 클래스의 메소드로 선언됩니다.

작업을로드하는 다른 방법은 컨트롤러의 'actions'메서드에 정의 된 '독립 실행 형'파일입니다. 이것은 다른 곳에있는 액션 클래스에 대한 참조 배열을 반환합니다.


당신은 당신이 먼저 행동 어레이 (독립 사람)을 통해보고 그것을 찾을 수없는 경우가 통해 보이는 것을 알 수 있습니다 (앱이 실행될 때 작업을로드하는)를 createAction method on yii\base\Controller 보면 자체 메서드 (이름을 형식화하고 'action'접두사를 추가 한 후 - 224-225 줄 참조).

문제는 기본 컨트롤러가 인라인 메서드를 찾을 때 php의 method_exists 함수를 사용한다는 것입니다.이 함수는 yii2의 동작 기능을 완전히 차단합니다.

대신 왜 동작 방법에 대해 알고 'hasMethod' method on the base controller을 사용하지 않는지 알 수 없습니다. 나는 단지이 수준의 세부 수준에서 Yii2를보고있을 뿐이 기 때문에 내가 알지 못하는 이유가있을 수 있습니다. Yii2가 찾아 오는 때 볼 수 없기 때문에 -


그래서 귀하의 질문에 대한 대답은 길 Yii2 현재 당신이 컨트롤러의 행동에 인라인 조치를 넣을 수 없습니다 코딩이다.

해결 방법은 독립 실행 형 작업으로 전환하는 것입니다.이 작업은 this guide page에서 읽을 수 있습니다.

0

동작을 Controller 클래스에서 확장해야하므로 동작 클래스의 메서드를 컨트롤러 동작으로 바꿀 수 없으므로 그렇게 할 수 없습니다.

기본 컨트롤러를 만들고 다른 컨트롤러를 변경하여 해당 컨트롤러에서 확장하여이 목표를 달성 할 수 있습니다. 아래처럼 :

use yii\web\Controller; 
class BaseCont extends Controller{ 
    public function actionGreat(){ 
     return "Hello"; 
    } 
} 

그런 다음 아래처럼 확장하는 컨트롤러를 만들어 :

class MyController extends BaseCont{ 
    //rest of code 
} 

당신은 MyController에서 다른 작업에 추가 greatAction있을 것이다.

-1

작업 클래스 정의로 작업을 추가 할 수 있습니다. 여기 항목 3 여기서 논의되고있다 http://www.yiiframework.com/doc/guide/1.1/en/basics.controller

귀하의 문제 참조 : 없음이 아직 가능하지 않다

을 "actionExample는"주어진 컨트롤러에 대한 유효한 방법 인 경우 CController::createAction() 확인하기 때문에. 행동 방법은 마법을 통해 호출되기 때문에 컨트롤러 내에 실제 방법이 없습니다 __get().

현재 임시 해결책으로 작동하려면 어떤 식 으로든 CController::createAction() 또는 CController::missingAction()을 무시할 수 있습니다.

http://www.yiiframework.com/forum/index.php/topic/10652-actions-by-behavioring/

+0

이 질문은 Yii2에 대한 답변이지만 Yii는 대답입니다. –

0

사용 컨트롤러 : 행동()

Yii2에서
public function actions() { 
    return [ 
     'ajaxsearch' => [ 
      'class'=>'app\components\searchlinewidget\AjaxSearchAction', 
      'searchClass'=>PublisherSearch::className() 
     ] 
    ]; 
}