Yii2 Modul override Controller, Model, Views

Yii2 Controllers

In Yii2 gibt es die Möglichkeit Module etc. über composer zu installieren. In der Regel werden sowohl alle Composer Yii2 erweiterungen als auch eigens kopierte Yii2 Module im Verzeichnis „vendor“ abgelegt. Ich gehe hier davon aus dass ein Yii2 Modul „user“ installiert wurde und beispielsweise beim aufrufen der User-Übersicht weitere Daten im Controller geladen werden sollen. Im ersten Schritt erstellen wir also einen Controller der genau dies tut. Wir nennen Ihn hier einfach ExtendedUserController. Nun möchte ich aber nicht das gesamte Yii2 Modul „user“ in meinen frontend Ordner kopieren. Hierzu können wir in unserer Yii2 Konfiguration zusätzlich eine ControllerMap angeben. Dies sieht wie folgt aus:

1
2
3
4
5
6
7
8
  'modules'    => [
    'user' => [
      'class'         => '\vendorname\modules\user\UserModule',
      'controllerMap' => [
        'user' => 'frontend\controllers\ExtendedUserController',
      ],
    ],
  ],

In unserer actionIndex möchten wir nun eine zusätzliche Aktion ausführen bevor wir den View rendern. Hierzu können wir jetzt unsere actionIndex einfach simpel überschreiben.

1
2
3
4
  public function actionIndex() {
    // Aktion die wir ausführen möchten
    return parent::actionIndex();
  }

Über parent::actionIndex() können wir die Originalversion der actionIndex() ansteuern. Möchten wir allerdings andere Daten an den View übergeben oder überhaupt eine vollkommen andere View-Datei rendern, müssen wir uns den Code der Originaldatei kopieren und einfach anpassen. Den aufruf parent::actionIndex() lassen wir dann weg.

 

Yii2 Models

Selbiges wie bei den Controllers geht auch bei den Models. Da dieses Thema in der Regel nicht ganz so Wichtig ist wie die Controller möchte ich nur ganz kurz darauf eingehen. Wir gehen davon aus dass wir ein Model „User“ in unserem user Modul haben. Auch diese Klasse erweitern wir in dem wir eine neue Klasse ExtendedUser erstellen die von der Ursprungsklasse User abstammt. Nun können wir in unserer Konfiguration wie bei den Controller auch die Models angeben:

1
2
3
4
5
6
7
8
9
10
11
12
    'modules' => [
        'user' => [
            'class' => 'vendorname\modules\user\UserModule',
            'components' => [
                'manager' => [
                    // Active record classes
                    'userClass'    => 'frontend\models\ExtendedUser',
                ],
            ],
        ],
        ...
    ],

 

Yii2 Views

Was allerdings für Controller und Models gilt, gilt natürlich auch für Views. Und genau dies ist extrem hilfreich. Gerade wenn man viele und auch gerne fremde Module einsetzt. So hat man die Möglichkeit eigene Ansichten für das fremde Yii2 Modul zu erstellen. Hierzu suchen wir uns den entsprechenden View im Modul raus und geben in der Konfiguration an dass wir hier einen eigenen View haben auf den zurück gegriffen werden soll. Mit folgendem Code sagen wir dass die View Files in unserem themes Ordner zu finden sind:

1
2
3
4
5
6
7
8
9
  'components' => [
    'view' => [
      'theme' => [
        'pathMap' => [
          '@vendor/modules/user/views' => '@app/themes/user/views'
        ],
      ],
    ],
  ],

Nun müssen wir nur noch den entsprechenden View Ordner aus dem Modul kopieren und können nun für das Modul jeweils vollkommen eigene Ansichten machen. In Verbindung zum ersten Abschnitt in dem wir einen Controller (und Model) erweitern, haben wir hier zum umgestalten von fremden Modulen vollkommene Freiheit.

 

Warum?

Warum sollten wir das jedoch so machen? Nun zum einen ist es vollkommen sauber getrennt was unser Code ist und was fremder Code ist. Allerdings haben wir noch einen viel wichtigeren Vorteil dadurch. Alle Yii2 Module und Erweiterungen die wir Beispielsweise über Composer installieren sind weiterhin vollkommen Updatefähig. Wir können uns also jederzeit die neuesten Updates der Erweiterungen über Composer holen und unsere Ansichten werden davon nicht beeinflusst.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert