Problemi con il caricamento automatico delle classi con JLoader :: registerPrefix


8

Questa è probabilmente una domanda davvero stupida ma non riesco a trovare la risposta e la prova e l'errore sono falliti.

Sto sviluppando un componente per Joomla 3.x e ho un numero di classi che voglio usare. Sto cercando di implementare il JLoader::registerPrefix()metodo. Diciamo che ho due lezioni Helpere NotHelpful. Helperè una classe statica memorizzata in:

JPATH_LIBRARIES. '/Foo/bar/Helper.php'

ed NotHelpfulè una classe non statica archiviata in:

JPATH_LIBRARIES. '/Foo/baz/NotHelpful.php'

Se voglio registrarli, la mia comprensione è che chiamerei:

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

cosa che sto facendo dal punto di ingresso all'applicazione.

Quindi per chiamare Helper, vorrei semplicemente usare FooBarHelper::method1();o per creare un'istanza di un nuovo NotHelpfulsarebbe$Class = new FooBazNotHelpful();

Ciò che non è chiaro per me è quello che dovrebbe essere il nome della classe all'interno di Helper.php o NotHelpful.php . Dovrebbe essere FooBarHelper, Helper, BarHelper, o qualcosa di completamente diverso?

Quando provo a chiamare FooBarHelper::method1();ricevo l'errore, indipendentemente dal nome della mia classe, sembra:

Errore irreversibile PHP: classe 'FooBarHelper' non trovata in

Sto chiaramente facendo almeno una cosa di sbagliato. Qualcuno può dirmi cosa sono uno o più di loro?

Risposte:


1

La mia comprensione del caricatore di prefissi è che i nomi dei file saranno SEMPRE tutti minuscoli.

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

Ma poi i nomi delle tue classi si traducono in percorsi di classe diversi.

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

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

Il sistema di prefissi segue sempre questa convenzione, in base al documento qui :

Il nome della classe deve essere in maiuscolo e ogni segmento del nome rappresenterà un percorso di cartella in cui l'ultimo segmento del nome è il nome del file di classe.

Per rispondere alla tua domanda finale, il nome della classe dovrebbe essere CamelCase e deve trovarsi in un file che ha un nome in minuscolo ed è in cartelle tutte minuscole.


Quindi, in questo esempio, la definizione della classe all'interno di utile.php potrebbe essere class Helpful { ...o class FooBazNotHelpful { ...qualcos'altro?
Andy,

classe FooBazNotHelpful @andy
David Fritsch,

4

Lo schema che stai cercando è in realtà [ComponentName] [Directory] [Nome]. I componenti generalmente hanno almeno le seguenti directory: controller, modello, vista, helper. Per un componente chiamato com_mycomponent con un file helper che è helper.php, sarebbe MycomponentHelperHelper. La formattazione della camelcase è particolarmente importante nella classe che viene correttamente riconosciuta.

A meno che il componente non fornisca classi che si desidera rendere disponibili ad altri componenti, non è necessario utilizzare JLoader :: registerPrefix (). Puoi invece semplicemente usare JLoader :: discover () e fornire quelle classi al tuo componente. per com_mycomponent / helpers questo significherebbe

JLoader :: discover ('Helpers', JPATH_COMPONENT. '/ Helpers');

Puoi anche usare JLoader :: registerNamespace () per usare gli spazi dei nomi PHP.

Vedi http://docs.joomla.org/Using_own_library_in_your_extensions per maggiori dettagli su questi metodi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.