Yii1: Контроллер:: beforeRender в 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
}

Когда мне нужна переменная, которая должна отображаться в Javascript, я бы просто использовал $this- > toJSObject в представлении или в контроллере.

Затем в контроллере я также использовал:

public function beforeRender($view){
  $this->printJSVarsObject();
}

В 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'
        );
    }
}

Но, если событие вне класса кажется мне странным. Кроме того, пока я нахожусь в контроллере, я не смогу использовать мой прежний подход, используя этот метод.

Очевидно, что я что-то пропустил, или мой подход просто неверен.

Как вы это делаете?

Ответ 1

Если вы пытаетесь получить доступ к свойствам контроллера из представления (см. выше комментарии!), вы можете использовать;

$this->context

чтобы вернуть экземпляр текущего используемого контроллера из файла представления. Поэтому для доступа к вашему методу beforeRender() вы просто используете

$this->context->beforeRender()