Problemas ao carregar classes automaticamente com o JLoader :: registerPrefix


8

Esta é provavelmente uma pergunta realmente estúpida, mas não consigo encontrar a resposta e a tentativa e erro falharam.

Estou desenvolvendo um componente para o Joomla 3.xe tenho várias classes que quero usar. Eu estou tentando implementar o JLoader::registerPrefix()método Digamos que eu tenho duas classes Helpere NotHelpful. Helperé uma classe estática armazenada em:

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

e NotHelpfulé uma classe não estática armazenada em:

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

Se eu quiser registrar estes, meu entendimento é: eu ligaria para:

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

o que estou fazendo do ponto de entrada para o aplicativo.

Em seguida, a chamada Helper, gostaria apenas de usar FooBarHelper::method1();ou para instanciar um novo NotHelpfulseria$Class = new FooBazNotHelpful();

O que não está claro para mim é qual deve ser o nome da classe real dentro de Helper.php ou NotHelpful.php . Caso seja FooBarHelper, Helper, BarHelper, ou algo completamente diferente?

Quando tento ligar FooBarHelper::method1();, recebo o erro, independentemente do nome da minha turma, parece:

Erro fatal do PHP: Classe 'FooBarHelper' não encontrada em

Estou claramente fazendo pelo menos uma coisa errada. Alguém pode me dizer o que um ou mais deles são?

Respostas:


1

Meu entendimento do carregador de prefixos é que seus nomes de arquivos SEMPRE serão minúsculos.

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

Porém, os nomes de suas classes são traduzidos para diferentes caminhos de classe.

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

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

O sistema de prefixos sempre segue esta convenção, com base no documento aqui :

O nome da classe deve estar em maiúsculas e minúsculas e cada segmento do nome representará um caminho de pasta em que o último segmento do nome é o nome do arquivo da classe.

Para responder à sua pergunta final, o nome da turma deve ser CamelCase e deve estar em um arquivo com um nome em minúsculas e em pastas todas em minúsculas.


Portanto, neste exemplo, a definição de classe em helpful.php seria class Helpful { ...ou class FooBazNotHelpful { ...ou algo mais?
Andy

classe FooBazNotHelpful @andy
David Fritsch

4

O esquema que você está procurando é realmente [ComponentName] [Directory] [Name]. Os componentes geralmente têm pelo menos os seguintes diretórios: controlador, modelo, exibição, auxiliares. Para um componente chamado com_mycomponent com um arquivo auxiliar que é helper.php, seria MycomponentHelperHelper. A formatação de camelcase é particularmente importante na classe sendo reconhecida corretamente.

A menos que seu componente esteja fornecendo classes que você gostaria de disponibilizar para outros componentes, você não precisa usar JLoader :: registerPrefix (). Você pode usar o JLoader :: discover () e fornecer essas classes ao seu componente. para com_mycomponent / helpers, isso significaria

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

Você também pode usar o JLoader :: registerNamespace () para usar os namespaces do PHP.

Veja http://docs.joomla.org/Using_own_library_in_your_extensions para obter mais detalhes sobre esses métodos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.