Como o Drupal lida com o carregamento automático de classes?

10

Como o Drupal lida com o carregamento automático de classes através de módulos? Por exemplo, se eu tenho um módulo de Eventos e declaro uma classe chamada Event, e no arquivo .info incluo o arquivo de classe, como isso é registrado?

O problema é que estou tentando obter dinamicamente uma matriz contendo todos os nomes de classes carregados. get_declared_classes () não retorna os nomes de todas as minhas classes declaradas dessa maneira, então estou assumindo que elas sejam carregadas automaticamente de alguma forma. Seguindo as sugestões de outra pergunta de estouro de pilha, tentei obter todas elas com spl_autoload_functions () , mas isso também não teve êxito.

Alguma ideia?

rybosome
fonte

Respostas:

13

Todos os arquivos listados nos arquivos .info são analisados ​​quando os módulos são recriados (somente arquivos novos / alterados nessa lista são, por razões de desempenho).

Essa informação é então armazenada nas tabelas {registry}e {registry_files}. Portanto, se você deseja obter todas as classes ou aquelas de acordo com um determinado padrão de nomenclatura, pode consultar essas tabelas.

Berdir
fonte
7

O Drupal mantém um registro de código e o utiliza para o carregador automático de suas classes. Para preencher esse registro com as classes do seu módulo, você deve adicionar os arquivos deles à entrada files [] do arquivo .info:

files[] = includes/Foo.inc
files[] = includes/Bar.inc

O carregamento automático de classe do PHP garantirá que o arquivo de classe pai também seja carregado.

Agradecendo ao usuário pier-buyle por esta resposta, veja a resposta original aqui da mesma pergunta.

espero que ajude

stefgosselin
fonte
5

spl_autoload_functions()retorna a lista das funções de carregamento automático que foram registradas spl_autoload_register(). O Drupal registra duas funções de carregamento automático: uma para as classes ( drupal_autoload_class () ) e outra para as interfaces ( drupal_autoload_interface () ).

Ambas as funções usam _registry_check_code () ; usando seu código, você pode escrever uma função que lista todas as classes implementadas pelos módulos do Drupal 7.

kiamlaluno
fonte
3

Se você adicionou uma entrada à matriz de arquivos [] do arquivo .info, terá que ir para a seção de administração de módulos e clicar em "salvar configuração". Isso ficará drupal para atualizar as informações .info e as novas entradas serão registradas.

Webdesigner007
fonte
1

Descobri que declarar meus arquivos de inclusão no arquivo de informações não os reconhece quando inicio a execução do módulo. Se eu tiver uma classe Event no arquivo event.inc. mas criar um objeto no módulo, ele não é reconhecido. Eu adiciono a linha

include_once ('CMatArticleHandler.inc');

anterior à variável $ = new event (); linha. Sou novo nisso, então pode haver mais do que isso, mas funcionou até agora.

Ashlar
fonte
11
Realmente lamentável que as pessoas apenas votem contra isso em vez de explicar o que fazer para evitar a necessidade de fazer isso. Estou na mesma situação: o carregador automático do Drupal não reconhece constantemente a necessidade de carregar um arquivo para obter uma classe.
greggles
É preciso limpar o registro ao adicionar novas classes. Uma maneira fácil de fazer Othis via Drush é com este comando: drupal.org/project/registry_rebuild
stefgosselin