Como o Drupal funciona? [fechadas]


151

Alguém poderia fornecer uma visão geral da arquitetura do fluxo de controle do Drupal 7? Talvez no sentido de um fluxograma sobre como uma página é gerada. Quais recursos adicionais você sugeriria consultar sobre como o Drupal funciona?


1
Questão? Então por que não você perguntar it yourself :-)
Liori

Eu não acho que houve um estouro de pilha naquela época. :)
Jeremy French

2
A comunidade Drupal está sempre procurando pessoas para ajudar na documentação. Por que não ajudar se a documentação é desajeitada ou os tutoriais são ruins? :)
Rimian

4
documentação requer a compreensão .. o que exige documentação ou muita experiência
Damon

Respostas:


160

O Drupal pode ser confuso nessa frente, em parte porque possui uma pilha de funções relativamente profunda. Embora seja PHP processual, é puramente orientado a eventos / ouvintes em sua arquitetura, e não existe um "fluxo" simples no script PHP principal para você observar. Recentemente, fiz uma apresentação sobre esse assunto e os slides são publicados no compartilhamento de slides, mas um rápido resumo de alto nível pode ser útil.

  • O arquivo index.php do Drupal funciona como um controlador frontal. Todas as páginas são canalizadas através dele, e o URL / caminho "real" solicitado pelo usuário é passado para index.php como parâmetro.
  • O sistema de roteador de caminho do Drupal (MenuAPI) é usado para corresponder o caminho solicitado a um determinado módulo de plug-in. Esse módulo de plug-in é responsável por criar o "conteúdo principal" da página.
  • Depois que o conteúdo da página principal é criado, o index.php chama o tema ('page', $ content), que transfere o conteúdo para o sistema de temas / skin do Drupal. Lá, está envolto em barras laterais / cabeçalhos / widgets / etc.
  • A página renderizada é devolvida ao apache e enviada ao navegador do usuário.

Durante todo esse processo, o Drupal e os módulos de plug-in de terceiros disparam eventos e aguardam a resposta deles. Drupal chama isso de sistema 'hook', e é implementado usando convenções de nomenclatura de funções. O módulo 'blog', por exemplo, pode interceptar 'usuário' relacionado, implementando uma função chamada blog_user (). Na linguagem Drupal, isso se chama hook_user () .

É um pouco desajeitado, mas devido a uma peculiaridade do PHP (mantém uma hashtable interna de todas as funções carregadas), permite ao Drupal verificar rapidamente os ouvintes apenas repetindo uma lista de plugins instalados. Para cada plug-in, ele pode chamar function_exists () no padrão de nome apropriado e chamar a função, se existir. ("Estou disparando o evento 'login'. A função 'mymodule_login' existe? Vou chamá-lo. Existe 'yourmodule_login'? Não? E o 'nextmodule_login'?" Etc.) etc.) Novamente, um toque desajeitado, mas funciona muito bem.

Tudo o que acontece no Drupal acontece por causa de um desses eventos ser disparado. O MenuAPI sabe apenas sobre quais URLs / caminhos são tratados por diferentes módulos de plug-in, pois dispara o evento 'menu' (hook_menu) e reúne todos os módulos com os quais os módulos de plug-in de metadados respondem. ("Eu cuidarei do URL 'news / recent' e aqui está a função de chamar quando a página precisar ser criada ...") O conteúdo só é salvo porque o FormAPI do Drupal é responsável pela criação de uma página e é acionado o evento 'um formulário foi enviado' para um módulo responder. A manutenção horária ocorre porque hook_cron () é acionado e qualquer módulo com mymodulename_cron () como um nome de função terá sua função chamada.

Tudo o resto são apenas detalhes - detalhes importantes, mas variações sobre esse tema. index.php é o controlador, o sistema de menus determina o que é a "página atual" e muitos eventos são disparados no processo de construção dessa página. Os módulos de plug-in podem se conectar a esses eventos e alterar o fluxo de trabalho / fornecer informações adicionais / etc. Isso também faz parte do motivo pelo qual muitos recursos do Drupal se concentram na criação de módulos. Sem módulos, o Drupal na verdade não faz nada além de dizer: 'Alguém pediu uma página! Isto existe? Não? OK, servirei 404.


1
FWIW, é um pouco diferente no D7 (o tema ('página') se foi e os símbolos agora estão armazenados em cache no registro de código), mas o processo geral permanece o mesmo.
FGM

2
Ótima explicação Eaton, Obrigado por estar aqui. Minha pergunta para você é: como você depura tudo isso, além de colocar var_dump em cada módulo para descobrir o que aconteceu?
Brian G

3
Boa pergunta. Depende do que você está depurando. A instalação do módulo devel pode ajudar, fornecendo algumas ferramentas úteis. A etapa (na maioria dos casos) é identificar qual módulo é responsável pela criação de uma determinada página. hook_menu () mapeia URLs / caminhos para módulos, para que possa ajudar. Em seguida, identificando o que o retorno de chamada do menu está fazendo - chamando drupal_get_form () para criar um formulário ou tema ('some_custom_thing') para criar HTML etc. etc. observe o uso de funções como drupal_alter () ou module_invoke_all () que acionam eventos para outros módulos, também ...
Eaton

Eu achei isso super útil. Você sabe como o Drupal 7 difere?
Hortitude

D7 Update: (ver também) drupal.org/node/350780
dreftymac

63

Mecanismo de veiculação de página do Drupal

Para entender como o Drupal funciona, você precisa entender o mecanismo de exibição de páginas do Drupal.

Em resumo, todas as chamadas / urls / solicitações são atendidas pelo index.php, que carrega o Drupal, incluindo vários arquivos / módulos de inclusão e, em seguida, chamando a função apropriada, definida no módulo, para atender à solicitação / url.

Aqui está o extrato do livro, Pro Drupal Development, que explica o processo de inicialização do Drupal,

O processo de inicialização

O Drupal se auto-inicia em todas as solicitações, passando por uma série de fases de auto-inicialização. Essas fases são definidas no bootstrap.inc e prosseguem conforme descrito nas seções a seguir.

Inicializar configuração

Essa fase preenche a matriz de configuração interna do Drupal e estabelece a URL base ($ base_url) do site. O arquivo settings.php é analisado via include_once (), e qualquer substituição de variável ou string estabelecida lá é aplicada. Consulte as seções "Substituições de variáveis" e "Substituições de string" dos sites de arquivo / all / default / default.settings.php para obter detalhes.

Cache de página anterior

Em situações que exigem um alto nível de escalabilidade, um sistema de armazenamento em cache pode precisar ser chamado antes que uma conexão com o banco de dados seja tentada. A fase inicial do cache da página permite incluir (com include ()) um arquivo PHP contendo uma função chamada page_cache_ fastpath (), que assume e retorna o conteúdo para o navegador. O cache da página inicial é ativado configurando a variável page_cache_fastpath como TRUE, e o arquivo a ser incluído é definido pela configuração da variável cache_inc no caminho do arquivo. Veja o capítulo sobre armazenamento em cache para um exemplo.

Inicializar banco de dados

Durante a fase do banco de dados, o tipo de banco de dados é determinado e é feita uma conexão inicial que será usada para consultas ao banco de dados.

Controle de acesso baseado em nome de host / IP

O Drupal permite o banimento de hosts por nome de host / endereço IP. Na fase de controle de acesso, é feita uma verificação rápida para verificar se a solicitação é proveniente de um host banido; Nesse caso, o acesso é negado.

Inicializar tratamento de sessão

O Drupal tira proveito do tratamento de sessões embutido do PHP, mas substitui alguns dos manipuladores pelos seus próprios para implementar o tratamento de sessões suportado por banco de dados. As sessões são inicializadas ou restabelecidas na fase da sessão. O objeto $ user global que representa o usuário atual também é inicializado aqui, embora, por questões de eficiência, nem todas as propriedades estejam disponíveis (elas são adicionadas por uma chamada explícita à função user_load () quando necessário).

Cache de página atrasado

Na fase de cache da página final, o Drupal carrega código de suporte suficiente para determinar se deve ou não servir uma página no cache da página. Isso inclui a mesclagem de configurações do banco de dados na matriz criada durante a fase de configuração de inicialização e o carregamento ou análise do código do módulo. Se a sessão indicar que a solicitação foi emitida por um usuário anônimo e o cache da página estiver ativado, a página será retornada do cache e a execução será interrompida.

Determinação de idioma

Na fase de determinação do idioma, o suporte multilíngue do Drupal é inicializado e é tomada uma decisão sobre qual idioma será usado para servir a página atual com base nas configurações do site e do usuário. O Drupal suporta várias alternativas para determinar o suporte ao idioma, como o prefixo do caminho e a negociação do idioma no nível do domínio.

Caminho

Na fase do caminho, o código que manipula os caminhos e o alias do caminho são carregados. Essa fase permite que URLs legíveis por humanos sejam resolvidas e lida com o cache e as pesquisas internas do caminho Drupal.

Cheio

Essa fase conclui o processo de autoinicialização carregando uma biblioteca de funções comuns, suporte a temas e suporte para mapeamento de retorno de chamada, manipulação de arquivos, Unicode, kits de ferramentas de imagem PHP, criação e processamento de formulários, manipulação de mensagens, tabelas classificáveis ​​automaticamente e paginação do conjunto de resultados. O manipulador de erros personalizado do Drupal está definido e todos os módulos ativados são carregados. Por fim, o Drupal aciona o gancho init, para que os módulos tenham a oportunidade de ser notificados antes do início do processamento oficial da solicitação.

Depois que o Drupal concluir a inicialização, todos os componentes da estrutura estarão disponíveis. É hora de pegar a solicitação do navegador e entregá-la à função PHP que irá lidar com isso. O mapeamento entre URLs e funções que os manipulam é realizado usando um registro de retorno de chamada que cuida do mapeamento de URL e controle de acesso. Os módulos registram seus retornos de chamada usando o gancho do menu (para mais detalhes, consulte o Capítulo 4).

Quando o Drupal determina que existe um retorno de chamada para o qual a URL da solicitação do navegador é mapeada com sucesso e que o usuário tem permissão para acessar esse retorno de chamada, o controle é entregue à função de retorno de chamada.

Processando uma solicitação

A função de retorno de chamada realiza todo o trabalho necessário para processar e acumular dados necessários para atender à solicitação. Por exemplo, se uma solicitação de conteúdo como http://example.com/q = node / 3 for recebida, a URL será mapeada para a função node_page_view () no node.module. Um processamento adicional recuperará os dados para esse nó do banco de dados e os colocará em uma estrutura de dados. Então, é hora de temas.

Temas de dados

A temática envolve a transformação dos dados que foram recuperados, manipulados ou criados em HTML (ou XML ou outro formato de saída). O Drupal usará o tema que o administrador selecionou para dar à página da Web a aparência correta. A saída resultante é então enviada para o navegador da web (ou outro cliente HTTP).


20

A resposta da Eaton fornece uma boa visão geral. (Eu sou novo aqui, então não posso modificá-lo, portanto, o comentário.)

O brutal momento "aha" para mim foi perceber que tudo acontece através do index.php e, em seguida, através da cascata de módulos (primeiro o núcleo, depois o site). Para estender a funcionalidade principal, não a reescreva. Em vez disso, copie o módulo em / sites / all / modules / ou / sites / [yoursite] / modules e estenda ISSO ou crie um novo módulo nesses locais. O mesmo para temas. Os diretórios dos módulos também podem conter código de exibição, na forma de tpl, css etc.

Se você está acostumado a estruturar estruturas do tipo MVC como Rails, Django etc. tudo isso fica um pouco confuso. Os módulos podem misturar muitos códigos de exibição e, se você estiver olhando para os módulos ou modelos de outra pessoa, acabará voltando pela pilha. Essa é a beleza / dor de trabalhar em PHP.

Ironicamente, "basta criar um aplicativo" pode ser a pior maneira de aprender isso. Drupal faz tanto fora da caixa que é simplesmente obscuro até você descobrir o fluxo de controle. Não há nada em um arquivo tpl que diga de onde vem uma função com um nome divertido como l (), por exemplo.


7

Depende de quão profundo você está procurando; se você tem um bom conhecimento de php, sugiro ler o código em si, começando com index.php e, em seguida, indo para o include / bootstrap.inc e alguns outros scripts nesse diretório.

A chave inclui arquivos:

  • O menu.inc é muito importante para entender como o sistema geral funciona, pois lida com grande parte do mapeamento implícito de URLs para o conteúdo.
  • O common.inc possui a maioria das funções misteriosas que formam a base da API.
  • module.inc lida com as chamadas de gancho mencionadas pela Eaton
  • O form.inc lida com a exibição, envio e processamento de formulários
  • theme.inc lida com a apresentação.

Há também algumas funcionalidades importantes no diretório modules /; em particular, modules / node / node.module forma a base do sistema de nós, que geralmente é usado para encapsular o conteúdo do site.

O código é, em geral, muito bem comentado e claro. O uso da marcação Doxygen nos comentários significa que o código é efetivamente a documentação canônica.

Também ajuda a fazer isso usando um editor que pode saltar rapidamente para a definição de uma função. Usar o vim em combinação com ctags funciona para mim; você precisa dizer ao ctags para indexar arquivos .inc, .module etc. como arquivos php.


5

Aprendi cargas importando o código drupal .php para um projeto NetBeans. Em seguida, você pode executar o depurador do netbeans e observar as diferentes fases da página.


5

Os melhores livros sobre o assunto são "Pro Drupal Development" e "Using Drupal".

O "Desenvolvimento Pro Drupal" inclui vários fluxogramas interessantes e resumos completos de cada uma das APIs do Drupal (formulários, temas etc.). O objetivo é ser especialmente instrutivo para as pessoas que criam seus próprios módulos e temas, mas tem muito valor para o desenvolvedor comum em PHP que quer entender o Drupal. Além disso, criei um módulo personalizado para todos os sites que construí, apenas para obter um controle extra sobre coisas como ocultar seletivamente campos em vários formulários (o que geralmente você deseja fazer para simplificar os formulários de nó para fins finais). usuários), por isso é bom ter esse conhecimento sob seu chapéu.

"Using Drupal" é direcionado ao desenvolvedor do site que deseja saber como criar as coisas boas, como galerias, blogs e sites de redes sociais. Ele passa por vários casos de uso e mostra como configurar os módulos existentes para realizar cada trabalho. No processo, ele o familiariza com os módulos complementares essenciais "Content Construction Kit" (CCK) e "Views", como criar blocos e modelos personalizados e os detalhes de como manter um site Drupal. Eu recomendo este livro especialmente para quem deseja acelerar e usar o Drupal imediatamente. No processo, você obtém uma compreensão da organização interna do Drupal.


5

This (for Drupal 6) & this (for Drupal 7) é uma boa visão geral da arquitetura do drupal. Se você quiser mais detalhes, eu começaria a escrever algo na maior parte da documentação. Tentar aprendê-lo com um alto nível de detalhes sem algo concreto a ser alcançado será muito mais difícil do que tentar algo.


4

Novo colaborador aqui, 2 anos atrasado na conversa ;-)

Replying to @Botafogo @botafogooficial

Para estender a funcionalidade principal, não a reescreva. Em vez disso, copie o módulo em / sites / all / modules / ou / sites / [yoursite] / modules e estenda ISSO ou crie um novo módulo nesses locais. O mesmo para temas.

Na verdade, nunca tive que copiar um módulo principal para atualizá-lo. Os ganchos Drupal devem ser tudo o que você precisa.

Para temas, sim, às vezes é o único caminho a percorrer, mas muitas vezes você pode criar um subtema para obter o resultado necessário.

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.