2016-07-17 4 views
2

저는 Yii2를 더 깊이 배우는 중입니다. 그래서 위젯이 컨트롤러의 액션과 비슷한 것을 가질 수 있는지 궁금합니다. 예에서Yii2. 위젯과 액션

: 컨트롤러에서 다음

class WTest extends Widget { 

    public ...; 

    public function init() { 
     ... 
    } 

    public function run() { 
     Pjax::begin(); 
     echo "<a href='".Yii::$app->urlManager->createAbsoluteUrl("test/add")."'>Add test</a>"; 
     Pjax::end(); 
    } 

    public function addThing() { 
     echo "hola" 
    } 
} 

는 수행

class TestController extends Controller 
{ 
    public function actionAdd() { 
    $wObj = new WTest; 
    return $wObj->addThing(); 
    } 
} 

이 방법이있는 문제는 내가 있기 때문에 형태의 위젯을 호출 할 때, 설정된 모든 매개 변수를 잃어 버릴 것입니다 "new WTest"를 호출하면 새로운 인스턴스입니다. 내가 정적 메서드를 사용하여,하지만 비슷한 문제, 어떤 아이디어를 시도 했나요? 뷰에서

UPDATE , 나는 다음과 같은 위젯을 호출 오전 :

 WTest::widget([ 
      'test' => 'hi' 
     ]); 
+0

를 사용하여 올바른 방향으로 저를 안내합니다. – ThanhPV

+0

예를 들어 주시겠습니까? 이 경우 Singleton을 적용하는 방법을 모르겠습니다. – Eduardo

답변

2

업데이트 : private __contruct(), __clone()를 제거하고 의존성 주입을 yii2 사용합니다. 클래스 WTest에서는 일부 기능과 변수를 정의해야합니다 :

class WTest extends Widget 
{ 
    /** 
    * @var WTest The reference to *WTest* instance of this class 
    */ 
    private static $instance; 

    /** 
    * Returns *WTest* instance of this class. 
    * 
    * @return WTest The *WTest* instance. 
    */ 
    public static function getInstance() 
    { 
     if (null === static::$instance) { 
      static::$instance = new static(); 
      //Add more attribute and do many stuff here 
     } 

     return static::$instance; 
    } 

    //If you want set value for variable, use yii2 DI 
    /** @var string $test */ 
    public $test; 
} 

을 그리고 당신의 행동에 사용

public function actionAdd() { 
    $wObj = WTest::getInstance(); 
    return $wObj->addThing(); 
} 

사용을보기에 :

WTest::widget([ 
    'test' => 'value', 
]); 

도움을 바랍니다.

싱글 톤 패턴에 대한 자세한 정보 : http://www.vincehuston.org/dp/singleton.html.

행운을 빈다. 당신이 그것을 위해`singleton` 패턴을 사용한다 ThanhPV에서

+0

시간을내어 주셔서 감사합니다. 나는 이것으로 시도하고 실험해볼 것이다 :) – Eduardo

+0

그것은 작동하지 않는 것 같다. 1. 복제와 생성은 수퍼 클래스의 public 메소드가 필요하다. 2.보기에서 위젯을 호출 할 때 매개 변수를 전달합니다. 어떻게 이들을 Singleton을 사용하여 유지할 수 있습니까? – Eduardo

+0

변수에 값을 주입하려면 내 대답을 업데이트하십시오. 싱글 톤이 필요하지 않습니다. 의존성 주입으로 설계된 Yii2. – ThanhPV

0

대답은 완전히 잘 아니었지만, 그것은 당신이 하나의 인스턴스 만이 할 경우 의존성 삽입 (Dependency Injection) :