Yii2。窗口小部件和操作

时间:2016-07-17 02:52:31

标签: php yii 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();
  }
}

这种方式的问题是我在表单中调用窗口小部件时松开了所有参数集,因为我称之为“新WTest”,它是一个新实例。我也试过使用静态方法,但类似的问题,任何想法?

更新 在视图中,我这样调用小部件:

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

2 个答案:

答案 0 :(得分: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

祝你好运,玩得开心!

答案 1 :(得分:0)

ThanhPV的答案并不完全正确,但它通过使用依赖注入引导我找到正确的方向:)