Yii1:Yii2中的Controller :: beforeRender

Chu*_*hux 11 php yii yii2

我正在将在Yii1中开发的旧应用程序迁移到Yii2.

我以前在控制器中有一个数组,它存储了我需要作为JavaScript发送到前端的所有变量:

public $jsVars;
public function toJSObject($params){
    $this->jsVars = array_merge($this->jsVars, $params);
}

private function printJSVarsObject(){
  //convert my php array into a js json object
}
Run Code Online (Sandbox Code Playgroud)

当我需要在Javascript中公开变量时,我只想在View或Controller中使用$ this-> toJSObject.

然后,在控制器中我也曾经有过:

public function beforeRender($view){
  $this->printJSVarsObject();
}
Run Code Online (Sandbox Code Playgroud)

在Yii2中,我必须使用自定义视图配置View组件,然后附加事件:

namespace app\classes;

use yii\base\Event;
use yii\helpers\Json;

Event::on(\yii\web\View::className(), \yii\web\View::EVENT_END_BODY, function($event) {
    $event->sender->registerJSVars();
});

class View extends \yii\web\View {
    public $jsVars = [];

    public function addJsParam($param){
        $this->jsVars = array_merge($this->jsVars, $param);
    }

    public function registerJSVars() {
        $this->registerJs(
            "var AppOptions= " . Json::htmlEncode($this->jsVars) . ";",
            View::POS_END,
            'acn_options'
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,在课堂外举办活动对我来说似乎很奇怪.此外,当我在控制器中时,我将无法使用此方法使用此方法.

显然,我错过了一些东西,或者我的方法是错误的.

你们是怎么做到的?

Joe*_*ler 3

如果您尝试从视图访问控制器的属性(请参阅上面的注释!),您可以使用;

$this->context
Run Code Online (Sandbox Code Playgroud)

从视图文件中返回当前使用的控制器的实例。因此,要访问您的beforeRender()方法,您只需使用

$this->context->beforeRender()
Run Code Online (Sandbox Code Playgroud)