Probleme beim automatischen Laden von Klassen mit JLoader :: registerPrefix


8

Dies ist wahrscheinlich eine wirklich dumme Frage, aber ich kann die Antwort nicht finden und Versuch und Irrtum sind fehlgeschlagen.

Ich entwickle eine Komponente für Joomla 3.x und habe eine Reihe von Klassen, die ich verwenden möchte. Ich versuche die JLoader::registerPrefix()Methode zu implementieren . Nehmen wir an, ich habe zwei Klassen Helperund NotHelpful. Helperist eine statische Klasse, gespeichert unter:

JPATH_LIBRARIES. '/foo/bar/Helper.php'

und NotHelpfulist eine nicht statische Klasse, gespeichert unter:

JPATH_LIBRARIES. '/foo/baz/NotHelpful.php'

Wenn ich diese registrieren möchte, würde ich nach meinem Verständnis anrufen:

JLoader::registerPrefix('Foo', JPATH_LIBRARIES . '/foo'); 

was ich vom Einstiegspunkt bis zur Anwendung mache.

Dann Anruf Helper, würde ich nur verwenden , FooBarHelper::method1();ein neues oder zu instanziiert NotHelpfulwäre$Class = new FooBazNotHelpful();

Was mir unklar ist, ist, wie der tatsächliche Klassenname in Helper.php oder NotHelpful.php lauten sollte. Sollte es sein FooBarHelper, Helper, BarHelper, oder etwas ganz anderes?

Wenn ich versuche anzurufen, FooBarHelper::method1();erhalte ich den Fehler, egal wie meine Klasse heißt:

Schwerwiegender PHP-Fehler: Klasse 'FooBarHelper' nicht gefunden in

Ich mache eindeutig mindestens eine Sache falsch. Kann mir jemand sagen, was einer oder mehrere von ihnen sind?

Antworten:


1

Mein Verständnis des Präfix-Loaders ist, dass Ihre Dateinamen IMMER nur in Kleinbuchstaben geschrieben sind.

Das ist gut: JLoader::registerPrefix('Foo', JPATH_LIBRARIES . '/foo');

Aber dann werden Ihre Klassennamen in verschiedene Klassenpfade übersetzt.

FooBarHelper => JPATH_LIBRARIES . '/foo/bar/helper.php'

FooBazNotHelpful => JPATH_LIBRARIES . '/foo/baz/not/helpful.php'

Das Präfixsystem folgt immer dieser Konvention, basierend auf dem Dokument hier :

Der Klassenname muss in Kamelbuchstaben angegeben werden und jedes Segment des Namens stellt einen Ordnerpfad dar, in dem das letzte Segment des Namens der Name der Klassendatei ist.

Um Ihre letzte Frage zu beantworten, sollte der Klassenname CamelCase sein und sich in einer Datei befinden, die einen Kleinbuchstaben enthält und sich in Ordnern befindet, die alle in Kleinbuchstaben geschrieben sind.


So in diesem Beispiel würde innerhalb helpful.php die Klassendefinition sein class Helpful { ...oder class FooBazNotHelpful { ...oder etwas anderes?
Andy

Klasse FooBazNotHelpful @andy
David Fritsch

4

Das gesuchte Schema ist tatsächlich [ComponentName] [Directory] [Name]. Komponenten haben im Allgemeinen mindestens die folgenden Verzeichnisse: Controller, Modell, Ansicht, Helfer. Für eine Komponente namens com_mycomponent mit einer Hilfsdatei, die helper.php lautet, wäre dies MycomponentHelperHelper. Die Camelcase-Formatierung ist besonders wichtig, damit die Klasse richtig erkannt wird.

Sofern Ihre Komponente keine Klassen bereitstellt, die Sie anderen Komponenten zur Verfügung stellen möchten, müssen Sie JLoader :: registerPrefix () nicht verwenden. Sie können stattdessen einfach JLoader :: remove () verwenden und diese Klassen für Ihre Komponente bereitstellen. Für com_mycomponent / helpers würde dies bedeuten

JLoader :: remove ('Helfer', JPATH_COMPONENT. '/ Helfer');

Sie können auch JLoader :: registerNamespace () verwenden, um PHP-Namespaces zu verwenden.

Weitere Informationen zu diesen Methoden finden Sie unter http://docs.joomla.org/Using_own_library_in_your_extensions .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.