Problèmes de chargement automatique des classes avec JLoader :: registerPrefix


8

C'est probablement une question vraiment stupide mais je ne trouve pas la réponse et les essais et erreurs ont échoué.

Je développe un composant pour Joomla 3.x et j'ai un certain nombre de classes que je veux utiliser. J'essaie de mettre en œuvre la JLoader::registerPrefix()méthode. Disons que j'ai deux classes Helperet NotHelpful. Helperest une classe statique stockée dans:

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

et NotHelpfulest une classe non statique stockée dans:

JPATH_LIBRARIES. «/foo/baz/NotHelpful.php»

Si je veux les enregistrer, je comprends que j'appellerais:

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

ce que je fais du point d'entrée à l'application.

Ensuite, pour appeler Helper, je voudrais simplement utiliser FooBarHelper::method1();ou pour instancier un nouveau NotHelpfulserait$Class = new FooBazNotHelpful();

Ce qui n'est pas clair pour moi, c'est quel devrait être le nom de la classe réelle dans Helper.php ou NotHelpful.php . Devrait - il être FooBarHelper, Helper, BarHelperou tout autre chose?

Lorsque j'essaie d'appeler, FooBarHelper::method1();j'obtiens l'erreur, quel que soit le nom de ma classe, il semble:

Erreur fatale PHP: classe 'FooBarHelper' introuvable dans

Je fais clairement au moins une chose de mal. Quelqu'un peut-il me dire ce que sont un ou plusieurs d'entre eux?

Réponses:


1

Ma compréhension du chargeur de préfixes est que vos noms de fichiers seront TOUJOURS en minuscules.

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

Mais alors vos noms de classe se traduisent en différents chemins de classe.

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

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

Le système de préfixe suit toujours cette convention, basé sur le doc ici :

Le nom de la classe doit être en cas de chameau et chaque segment du nom représentera un chemin de dossier où le dernier segment du nom est le nom du fichier de classe.

Pour répondre à votre dernière question, le nom de la classe doit être CamelCase, et il doit se trouver dans un fichier portant un nom en minuscules et se trouvant dans des dossiers tous en minuscules.


Ainsi, dans cet exemple, la définition de classe au sein d'utilitaire.php serait class Helpful { ...-elle class FooBazNotHelpful { ...ou quelque chose d'autre?
Andy

class FooBazNotHelpful @andy
David Fritsch

4

Le schéma que vous recherchez est en fait [ComponentName] [Directory] [Name]. Les composants ont généralement au moins les répertoires suivants: contrôleur, modèle, vue, assistants. Pour un composant appelé com_mycomponent avec un fichier d'assistance qui est helper.php, ce serait MycomponentHelperHelper. Le formatage du chameau est particulièrement important pour que la classe soit correctement reconnue.

À moins que votre composant ne fournisse des classes que vous voudriez rendre disponibles à d'autres composants, vous n'avez pas besoin d'utiliser JLoader :: registerPrefix (). Vous pouvez à la place simplement utiliser JLoader :: Discover () et fournir ces classes à votre composant. pour com_mycomponent / helpers, cela signifierait

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

Vous pouvez également utiliser JLoader :: registerNamespace () pour utiliser des espaces de noms PHP.

Voir http://docs.joomla.org/Using_own_library_in_your_extensions pour plus de détails sur ces méthodes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.