Problemas de carga automática de clases con JLoader :: registerPrefix


8

Esta es probablemente una pregunta realmente estúpida, pero no puedo encontrar la respuesta y la prueba y error ha fallado.

Estoy desarrollando un componente para Joomla 3.xy tengo varias clases que quiero usar. Estoy tratando de implementar el JLoader::registerPrefix()método. Digamos que tengo dos clases Helpery NotHelpful. Helperes una clase estática almacenada en:

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

y NotHelpfules una clase no estática almacenada en:

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

Si quiero registrarlos, entiendo que llamaría:

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

que estoy haciendo desde el punto de entrada a la aplicación.

Luego, para llamar Helper, simplemente usaría FooBarHelper::method1();o para crear una instancia nueva NotHelpfulsería$Class = new FooBazNotHelpful();

Lo que no está claro para mí es cuál debería ser el nombre real de la clase dentro de Helper.php o NotHelpful.php . ¿Debería ser FooBarHelper, Helper, BarHelper, o algo completamente distinto?

Cuando intento llamar FooBarHelper::method1();recibo el error, no importa cómo se llame mi clase, parece:

Error fatal de PHP: no se encontró la clase 'FooBarHelper' en

Claramente estoy haciendo al menos una cosa mal. ¿Alguien puede decirme cuáles son uno o más de ellos?

Respuestas:


1

Entiendo que el cargador de prefijos es que sus nombres de archivo SIEMPRE estarán en minúsculas.

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

Pero luego los nombres de sus clases se traducen en diferentes rutas de clases.

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

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

El sistema de prefijos siempre sigue esta convención, basado en el documento aquí :

El nombre de la clase debe estar en mayúsculas y cada segmento del nombre representará una ruta de carpeta donde el último segmento del nombre es el nombre del archivo de clase.

Para responder a su pregunta final, el nombre de la clase debe ser CamelCase, y debe estar en un archivo que tenga un nombre en minúscula y esté en carpetas que están en minúscula.


Así que en este ejemplo sería la definición de clases dentro de helpful.php ser class Helpful { ...o class FooBazNotHelpful { ...o alguna otra cosa?
Andy

clase FooBazNotHelpful @andy
David Fritsch

4

El esquema que está buscando es en realidad [ComponentName] [Directorio] [Nombre]. Los componentes generalmente tienen al menos los siguientes directorios: controlador, modelo, vista, ayudantes. Para un componente llamado com_mycomponent con un archivo auxiliar que es helper.php, ese sería MycomponentHelperHelper. El formato camelcase es particularmente importante para que la clase sea reconocida adecuadamente.

A menos que su componente proporcione clases que desee poner a disposición de otros componentes, no necesita usar JLoader :: registerPrefix (). En su lugar, puede usar JLoader :: discover () y proporcionar esas clases a su componente. para com_mycomponent / helpers esto significaría

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

También puede usar JLoader :: registerNamespace () para usar espacios de nombres PHP.

Consulte http://docs.joomla.org/Using_own_library_in_your_extensions para obtener más detalles sobre esos métodos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.