Fragen zum Autoloader

Gesperrt
bodil
Beiträge: 375
Registriert: Fr 7. Okt 2011, 04:10
Hat sich bedankt: 2 Mal
Danksagung erhalten: 7 Mal
Kontaktdaten:

Fragen zum Autoloader

Beitrag von bodil »

In der Datei includes/api/functions.api.general.php gibt es die Funktion contenido_include(). Darin gibt es nun die Möglichkeit, Klassen per Autoload zu laden. Die prinzipielle Idee dahinter ist mir in groben Zügen klar, aber vielleicht kann mir trotzdem jemand mal erklären was hier (ab Zeile 111) passiert:

Code: Alles auswählen

      case "classes":
            if (cAutoload::isAutoloadable($cfg['path'][$where] . $what)) {
                // The class file will be loaded automatically by the autoloader - get out here
                return;
            }
            $sInclude = $backendPath  . $cfg['path'][$where] . $what;
            break;
Bzw. um genauer zu fragen: was bedeutet das, wenn eine Klasse nicht geladen werden kann? Woran liegt das? Und warum wird dann der Variable $sInclude ein Wert zugewiesen, der nie wieder benutzt wird?
In meinem konkreten Fall habe ich im Ordner classes einen eigenen Ordner myClasses liegen, ich will mit

Code: Alles auswählen

cinclude("classes", "myClasses/myNaviClass.php");
eine Datei daraus laden. Das scheint (laut Errorlog) fehlzuschlagen, obwohl es bisher immer ging. Und mein Errorlog weiß nichtmal, was da gerade nicht geklappt hat, denn die Variable $include ist ja leer, die relevanten Daten stehen in $sInclude.
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: Fragen zum Autoloader

Beitrag von xmurrix »

In der Zeile 111 (und folgende) wird überprüft, ob die Klassen-Datei, die per

Code: Alles auswählen

cInclude("classes", "...");
eingebunden werden soll, im Autoloader registriert ist. Falls ja, wird die Funktion cInclude verlassen, da das Einbinden von Klassen-Dateien vom Autoloader übernommen wird.

In der Version 4.8.17 ist der Autoloader integriert, der sich darum kümmert, CONTENIDO Core Klassen-Dateien zu laden, die braucht man nicht manuell mit

Code: Alles auswählen

cInclude("classes", "someClass.php");
einbinden.

Das funktioniert aber nur mit Klassen, die in CONTENIDO mitgeliefert werden und im Verzeichnis contenido/classes/ liegen. Eigene/Benutzerdefinierte Klassen-Dateien werden nicht vom Autoloader automatisch geladen, die musst du weiterhin mit

Code: Alles auswählen

cinclude("classes", "myClasses/myNaviClass.php");
einbinden, oder diese Klassen im Autoloader registrieren.

Details zum Autoloader und wie man eigene Klassen-Dateien registrieren kann, findest du auch unter "docs/techref/backend/backend.autoloader.html".

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
dominik.ziegler
Beiträge: 437
Registriert: Do 19. Jun 2008, 09:09

Re: Fragen zum Autoloader

Beitrag von dominik.ziegler »

bodil hat geschrieben:eine Datei daraus laden. Das scheint (laut Errorlog) fehlzuschlagen, obwohl es bisher immer ging. Und mein Errorlog weiß nichtmal, was da gerade nicht geklappt hat, denn die Variable $include ist ja leer, die relevanten Daten stehen in $sInclude.
Scheinbar hast du die fehlerhafte Version der 4.8.17 herunter geladen. Für diesen Bereich gibt es bereits einen Fix.
:arrow: http://forum.contenido.org/viewtopic.php?f=63&t=32351
:arrow: oder die 4.8.17 neu herunterladen bzw. auf die 4.8.18 warten, die voraussichtlich morgen erscheint
Viele Grüße
Dominik
derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Re: Fragen zum Autoloader

Beitrag von derSteffen »

Ich will noch ergänzen ...

Wenn man seinen Ordner "Contenido" umbenennt, müssen die Pfade in der config.autoloader.php auch angepasst werden.

Z.B. von so:

Code: Alles auswählen

'Action' => 'contenido/classes/class.action.php',
auf so:

Code: Alles auswählen

'Action' => 'meinneuerordnername/classes/class.action.php',
MfG Steffen
Gesperrt