Post on 13-Apr-2017
Hooks, plugins, eventos e serviços, como usar tudo isso no Drupal 8?
Felipe Ribeiro
Desenvolvedor Sr.CI&T
Felipe Ribeiro (felribeiro)
Desenvolvo com drupal há 5 anosTrabalho na CI&T como desenvolvedor drupal sênior.
- Alterar, estender e incrementar o Drupal
- Plugins, Serviços, Eventos e Hooks
- Exemplos de cada um deles
- Como escolher a ferramenta certa
O que veremos?
Não hackeie o core e módulos.
Não hackeie, use uma hook, escreva um plugin, crie um serviço ou
responda a um evento.
Permita que outras pessoas consigam alterar seu módulo sem
precisar hackeá-lo.
Plugins
Plugins
- Prove uma funcionalidade configurável, de maneira que permita, ao sistema ou ao usuário final, escolher um item ou mais de uma lista.
- Auxilia no aprendizado do desenvolvedor
- Todo código em um só lugar
Exemplos de Plugins- Blocks
- Field types
- Field formatters
- Views styles
- Actions
Receita de Plugin1 - Determine o tipo de plugin- Onde a meta-data e o código vão?
2 - Existe uma classe base para estender?
3 - Implemente uma interface e coloque a meta-data, para que o plugin manager possa achar a sua instância
Receita de Tipos de Plugin- Plugins que que tem funcionalidades similares
são do mesmo plugin type
- Você pode implementar seu próprio tipo de plugin, veja DefaultPluginManager
Alguns links sobre Plugins
https://www.drupal.org/developing/api/8/plugins
https://drupalize.me/blog/201407/drupal-8-plugins-explained
https://drupalize.me/blog/201409/unravelling-drupal-8-plugin-system
Serviços
Serviços são muito interessantes
- Eles são dissociados do Drupal
- Serviços podem ser trocados
- Fácil de testar
- Ótima reusabilidade
Exemplos de Serviços- Acesso ao Cache e Banco de Dados
- Plugin Manager, disparo de Eventos
- Integrações com API
- Manipulador de validações
https://api.drupal.org/api/drupal/services/8.2.x
Receita de Serviço1. Escolha um nome único. Dica: Use o nome do módulo como
prefixo, ‘mymodule.service_name’
2. Defina uma interface, e a implemente
3. Registre o serviço no arquivo mymodule.services.yml
4. Acesse o serviço via container usando o nome único \Drupal::service('mymodule.service_name')
Links sobre Serviços
https://www.drupal.org/node/2133171
https://api.drupal.org/api/drupal/core%21core.api.php/ group/container/8.2.x
https://drupalize.me/series/module-development-essentials
Eventos
Eventos
- Reagir a uma ação/condição da aplicação, sem modificá-la
- Eventos são práticas comuns em OOP, já as hooks são mais Drupalistas
Receita de Eventos - Assinatura1. Determine o nome do evento
https://api.drupal.org/api/drupal/core%21core.api.php/group/events/8.2.x
2. Define um apelido para o serviço
Receita de Eventos - Assinatura3. Implemente \Symfony\Component\EventDispatcher \EventSubscriberInterface em \Drupal \mymodule\EventSubscriber namespace
Receita de Eventos - Disparo1. Adicione uma classe em Drupal/my_module/Events namespace.
2. A classe deve extender \Symfony\Component\EventDispatcher\Event, que irá prover informações adicionais ao evento
3. Use \Drupal\Component\EventDispatcher \ContainerAwareEventDispatcher::dispatch();
e passe o nome do evento e o objeto da classe criada.
Links sobre Eventos
https://drupalize.me/blog/201502/responding-events-drupal-8
http://symfony.com/doc/current/components/event_dispatcher /introduction.html
https://drupalize.me/series/module-development-essentials
https://api.drupal.org/api/drupal/core%21core.api.php/group /events/8
Hooks
Hooks- Nas versões anteriores do Drupal, muitas coisas eram feiras
com hook
- É bom para alterar dados existentes
- Rápido!
- Quando o Drupal começou a utilizar hooks (2001), era a melhor solução da época
Exemplos de Hooks
- Alterar formulário, hook_form_alter().
- Modificar meta-data de um campo/entidade, hook_field_info()
- Drupal 7
Receita de Hook1. Determine o nome da hook que vai implementar
Ex: hook_form_alter()
2. Adicione uma função no seu arquivo .module com o nome da hook, substitua “hook” pelo nome do seu módulo
Ex: example_form_alter()
3. Implemente de acordo com a documentação
4. Limpe o cache (nem sempre necessário)
Receita de Hooks - Chamar1. Pegue o nome único da sua hook
2. Use \Drupal\Core\Extension\ModuleHandlerInterfacemétodos
Links sobre Hooks
{MODULE_NAME}.api.php
https://api.drupal.org/api/drupal/core%21core.api.php /group/hooks/8.2.x
Hooks ou Eventos?
Vídeo upload moduleUsando plugin para você poder escolher onde o vídeo vai ser hospedado.
Usando serviço para enviar o vídeo
Usando serviço para interagir com cada api (youtube, brightcove, etc)
Disparando eventos para que outros módulos possam interagirEx: Dispara um evento quando o vídeo termina de carregar
Chama uma hook alter para permitir que outros módulos possam alterar as configurações dos vídeos.
Ex: Mudar a qualidade do vídeo
ObrigadoFelipe RibeiroEmail: fribeiro@ciandt.com