logo
KUNDENPORTAL

Mehrere Basis-Controller in CodeIgniter

Von dlaube am Tuesday, 14.11.2017 22:39

CodeIgniter ist ein schönes Framework zum Bau einer Webseite. Durch seine Freiheit lassen sich viele Projekte schnell und einfach realisieren.

Aber es gibt auch einige kleine Probleme: Zum einen das case-sensitive Gewirrwar* und die Fehlende Dokumentation von eigenen Core-Klassen.


Wofür Mehrere Basis-Controller?

Dafür gibt es allerlei Gründe:

  • Auslagerung von Code
  • Deduplizierung
  • Generell alle Gründe für Vererbungen


Mehrere Basis-Controller

CodeIgniter besitzt einen Mechanismus um eigene Core-Klassen zu laden. Dazu schreibt man eine Datei im Ordner "application/core/" mit dem Namen MY_<Klasse>.php, in unserem Beispiel also MY_Controller.php .

Und nun der kleine undokumentierte Trick: CodeIgniter erwartet normalerweise, dass der Klassenname gleich dem Dateinamen ist. Doch bei dieser Erweiterungsmechanik greift diese Regel nicht.

Es lassen sich in MY_Controller somit beliebig viele BasisController schreiben. Natürlich können diese auch voneinander Erben.


Verwendungsbeispiel

Üblicherweise besitzten Webseiten soetwas wie einen Footer. In dem Footer dieser Seite gibt es zum Beispiel eine Auflistung aller News und Blogposts. Damit man die Logik dafür nicht in den View packen muss (Mit Trickserei geht das!), lagere ich den Footer in eine Methode footer() um, welche Das News-/Blogmodel und den Footer-View lädt.

Alle normalen Controller erben nun von diesem eigenen Basiscontroller und binden nicht den Footer-View ein sondern rufen die footer()-Methode auf.

Das gleiche wurde in ähnlicher Form mit dem Header der Seite gemacht um den Code übersichtlicher zu gestalten.

Problem: Bisher würde ein einziger Controller reichen. Jetzt soll die Funktion von Zugriffgesperrten Seiten hinzukommen. Dazu wird im Konstruktor eines weiteren BasisControllers, welcher von dem vorherigen BasisController erbt, geprüft, ob der Benutzer entsprechende Rechte hat (auslesen von Sessionvariable etc.); besitzt er diese Rechte nicht, wird direkt ein redirect ausgeführt. Vorteil dabei: Jeder Controller, der von dieser Klasse erbt, kann nur von Nutzern mit Rechten benutzt werden.

Im eigentlichen Controller ist kein Check mehr nötig.

Würde man dieses Ebenfalls in den ersten BasisController einpflegen, so wäre keine Seite mehr von unpreveligierten Nutzern mehr erreichbar.


TL;DR

Im Verzeichnis "application/core/" eine Datei MY_Controller.php anlegen. In ihr lassen sich beliebe Controllerbasisklassen definieren, welche alle in den eigentlichen Controllern zur Verfügung stehen. CodeIgniter forciert hier nicht das Dateiname = Klassenname Schema.





* Grund für das Dilemma: CodeIgniter wandelt alle Namen in die Form mit Groschreibung am Anfang, Kleinschreibung sonst um. Besitzt man einen Entwicklungsrechner mit Windows wird man auch bei Abweichender Namensgebung im Dateinamen einen Fehler feststellen. Lädt man das Projekt aber anschließend auf einen Server mit Linux/Unix hoch, so kann es zu Problemen kommen (Windows ist case-insensitiv, Linux/Unix ist case-sensitiv).

CodeIgniter sollte einfach alle zu ladenden Namen nehmen und inkludieren wie es sie zum laden bekommt.