2017-05-03 4 views
11

Ich migriere eine alte in Yii1 entwickelte App zu Yii2.Yii1: Controller :: beforeRender in Yii2

Ich benutzen einen Array in der Steuerung zu haben, die alle Variablen wurden zu speichern, die ich an das Frontend als JavaScript zu senden brauchen würde:

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 
} 

Wenn ich eine Variable in Javascript ausgesetzt werden benötigt, Ich würde einfach $ this-> toJSObject in der Ansicht oder im Controller verwenden.

Dann in der Steuerung Früher habe ich auch haben:

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

In Yii2, ich hatte die View-Komponente mit einer benutzerdefinierten Ansicht konfigurieren und dann ein Ereignis anhängen:

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

Aber Das Ereignis außerhalb der Klasse zu haben, erscheint mir seltsam. Auch wenn ich in der Steuerung bin, kann ich meinen früheren Ansatz mit dieser Methode nicht verwenden.

Offensichtlich vermisse ich etwas, oder mein Ansatz ist nur falsch.

Wie machen Sie das?

+0

Die 'Before()' Methode zur Ansicht bewegt hat in Yii2 verwenden würden, so können Sie einfach außer Kraft setzen, dass jedes Mal, wenn Sie sie brauchen in Ihrem Controller, zum Beispiel; '\ Yii :: $ app-> view-> on (Ansicht :: EVENT_END_BODY, function() { Echodatum ('Ym-d'); });' Wenn Sie komplexeren Code haben und ihn behalten wollen DRY dann einfach anhängen als Verhalten des Controllers –

+0

Oder, wenn Sie gerade versuchen, auf Eigenschaften des Controllers aus Ihrer Sicht zuzugreifen, können Sie '$ this-> context' verwenden, um auf den Controller zuzugreifen –

+0

Ja, das ist was Ich mache manchmal, ich habe nur nach dem "perfekten" Ansatz gesucht. Bitte antworte nochmal mit der $ this-> context antwort, damit ich es annehmen kann;) danke für deine zeit dude – Chux

Antwort

3

Wenn Sie versuchen, auf Eigenschaften des Controllers von einer Ansicht aus zuzugreifen (siehe obige Kommentare!), Können Sie;

$this->context 

, um eine Instanz des aktuell verwendeten Controllers aus der Ansichtsdatei zurückzugeben. Also für den Zugriff auf Ihre beforeRender() Methode, die Sie gerade

$this->context->beforeRender() 
+0

Vielen Dank nochmal! – Chux