我正在深入学习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'
]);
答案 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的答案并不完全正确,但它通过使用依赖注入引导我找到正确的方向:)