web-dev-qa-db-fra.com

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

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

Je développe un composant pour Joomla 3.x et je souhaite utiliser un certain nombre de classes. J'essaie d'implémenter la méthode JLoader::registerPrefix(). Disons que j'ai deux classes Helper et NotHelpful. Helper est une classe statique stockée dans:

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

et NotHelpful est une classe non statique stockée dans:

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

Si je veux les enregistrer, je comprend que j'appelle:

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

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

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

Ce qui n'est pas clair pour moi est ce que le nom de classe réel à l'intérieur de Helper.php ou NotHelpful.php devrait être. Devrait-il s'agir de FooBarHelper, Helper, BarHelper ou autre chose?

Lorsque j'essaie d'appeler FooBarHelper::method1();, l'erreur se produit, peu importe le nom de ma classe, il semble:

Erreur irrécupérable PHP: la classe 'FooBarHelper' ne figure pas dans

Je fais clairement au moins une chose qui ne va pas. Quelqu'un peut-il me dire ce qu'un ou plusieurs d'entre eux sont?

8
Andy

D'après ce que je comprends du chargeur de préfixes, vos noms de fichiers seront TOUJOURS en minuscules.

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

Mais ensuite, les noms de classe sont traduits en chemins de classe différents.

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 la doc ici :

Le nom de la classe doit être en cas de chameau et chaque segment du nom représente 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 doit figurer dans un fichier portant un nom en minuscule et se trouvant dans des dossiers en minuscules.

1
David Fritsch

Le schéma que vous recherchez est en réalité [NomComposant] [Répertoire] [Nom]. 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 helper.php, il s'agirait de MycomponentHelperHelper. Le formatage camelcase est particulièrement important pour que la classe soit correctement reconnue.

À moins que votre composant fournisse des classes que vous souhaitez rendre disponibles pour d'autres composants, vous n'avez pas besoin d'utiliser JLoader :: registerPrefix (). Vous pouvez plutôt 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 PHP espaces de noms.

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

4
Jeremy Proffitt