Eventos e Ouvintes
Chamilo utiliza o sistema de eventos do Symfony para comunicação desacoplada entre componentes.
Listeners de Eventos
Chamilo utiliza dois locais para listeners:
src/CoreBundle/EventListener/— Listeners de kernel/HTTP do Symfony (requisição, resposta, exceção, login/logout, acesso a curso/sessão, etc.). Exemplos:CidReqListener,CourseAccessListener,LoginSuccessHandler,LogoutListener,ExceptionListener,ResourceDoctrineListener.src/CoreBundle/Entity/Listener/— Listeners de entidades Doctrine associados a entidades específicas. Exemplos:ResourceNodeListener,CourseListener,SessionListener,LanguageListener,UserListener,MessageListener.
Escolha o local que corresponde ao que você precisa reagir: eventos do pipeline HTTP vão para EventListener/; ganchos de ciclo de vida de entidades vão para Entity/Listener/.
Subscribers de Eventos
Localizados em src/CoreBundle/EventSubscriber/:
Subscribers de eventos podem escutar múltiplos eventos:
Subscribers de segurança — Lidam com eventos de login/logout, rastreiam tentativas de login
Subscribers de API — Pré/pós-processamento para requisições de API
Subscribers de Doctrine — Reagem a eventos de ciclo de vida de entidades
Eventos de Ciclo de Vida do Doctrine
Entidades utilizam #[ORM\HasLifecycleCallbacks] para eventos no nível do banco de dados:
Criando Listeners Personalizados
Para adicionar comportamento personalizado:
Crie uma classe de listener/subscriber no bundle apropriado
Marque-a como um listener ou subscriber de evento na configuração de serviço
Implemente o método de manipulação
Eventos Principais
kernel.request
A cada requisição HTTP
kernel.response
Antes de enviar a resposta HTTP
security.interactive_login
Quando o usuário faz login
doctrine.prePersist
Antes de uma entidade ser salva pela primeira vez
doctrine.postUpdate
Após uma entidade ser atualizada
Eventos Específicos do Chamilo
Esses eventos são disparados pelo próprio código do Chamilo e são os principais pontos de integração para plugins. Constantes são definidas em Chamilo\CoreBundle\Event\Events.
Events::COURSE_CREATED
chamilo.event.course_created
Após a criação de um curso
Events::COURSE_ACCESS_CHECK
chamilo.course_access_check
Antes de um usuário acessar um curso
Events::COURSE_USER_SUBSCRIPTION_CHECK
chamilo.event.course_user_subscription_check
Antes de um usuário se inscrever em um curso
Events::SESSION_RESUBSCRIPTION
chamilo.event.session_resubscription
Quando um usuário tenta se reinscrever em uma sessão
Events::LOGIN_CREDENTIALS_CHECKED
chamilo.event.login_credentials_checked
Após a validação das credenciais de login
Events::LOGIN_CONDITION_CHECKED
chamilo.event.login_condition_checked
Após a verificação de condições adicionais de login
Events::DOCUMENT_ACTION
chamilo.event.document_action
Quando a barra de ferramentas do documento é renderizada
Events::DOCUMENT_ITEM_ACTION
chamilo.event.document_item_action
Quando botões de ação por arquivo são renderizados
Events::DOCUMENT_ITEM_VIEW
chamilo.event.document_item_view
Quando um documento é aberto para visualização
Events::EXERCISE_REPORT_ACTION
chamilo.event.exercise_report_action
Quando a página de relatório de exercícios renderiza seus links de ação
Events::EXERCISE_ENDED
chamilo.event.exercise_ended
Após um aluno enviar um exercício
Events::EXERCISE_QUESTION_ANSWERED
chamilo.event.question_answered
Após cada pergunta ser respondida
Events::LP_CREATED
chamilo.event.learning_path_created
Após a criação de um caminho de aprendizagem
Events::LP_ITEM_VIEWED
chamilo.event.learning_path_item_viewed
Quando um aluno abre um item de caminho de aprendizagem
Events::LP_ENDED
chamilo.event.learning_path_ended
Após um aluno completar um caminho de aprendizagem
Events::ADMIN_BLOCK_DISPLAYED
chamilo.event.admin_block_displayed
Quando o painel de administração constrói sua lista de blocos
Events::USER_CREATED
chamilo.event.user_created
Após a criação de uma conta de usuário
Events::USER_UPDATED
chamilo.event.user_updated
Após a atualização de uma conta de usuário
Events::USER_DELETED
chamilo.event.user_deleted
Após a exclusão de uma conta de usuário
Events::PORTFOLIO_ITEM_ADDED
chamilo.event.portfolio_item_added
Após a criação de um item de portfólio
Events::NOTIFICATION_CONTENT_FORMATTED
chamilo_hook_event.notification_content
Quando o corpo de uma notificação é formatado
Exemplo de Plugin: Adicionando um Botão ao Visualizador de Documentos
Esta seção explica como um plugin utiliza um subscriber de evento para injetar um botão em uma página existente do Chamilo — sem necessidade de modificação do código principal.
Cenário
Um plugin chamado MyViewer deseja adicionar um botão "Abrir no MyViewer" ao lado de cada documento no gerenciador de arquivos do curso. O evento relevante é Events::DOCUMENT_ITEM_VIEW, disparado pelo Chamilo sempre que um documento está prestes a ser exibido, carregando a entidade CDocument e uma lista mutável de links.
Estrutura do diretório do plugin
Classe principal do plugin (src/MyViewerPlugin.php)
src/MyViewerPlugin.php)A classe base Plugin fornece isEnabled(), get($settingKey) e auxiliares para instalar ferramentas de curso e configurações. O padrão singleton (static $instance) é a convenção padrão do Chamilo porque a classe do plugin também é instanciada fora do contêiner Symfony (em páginas PHP legadas).
Assinante de eventos (src/EventSubscriber/MyViewerEventSubscriber.php)
src/EventSubscriber/MyViewerEventSubscriber.php)addLink() adiciona HTML ao array que o modelo de visualização de documentos do Chamilo renderiza ao lado das ações integradas "Download" e "Preview". O assinante nunca modifica os arquivos principais do Chamilo.
Registro
Não é necessário registro manual de serviços. O arquivo config/services.yaml do Chamilo habilita o sinalizador autoconfigure globalmente, que marca automaticamente qualquer classe que implemente EventSubscriberInterface como um kernel.event_subscriber. Desde que o diretório do plugin seja carregado (via classmap do Composer ou autoload PSR-4), o Symfony detecta o assinante na próxima limpeza de cache.
Como os dados do evento fluem
Vários plugins podem se inscrever no mesmo evento de forma independente; cada um adiciona aos dados compartilhados sem saber dos outros. A ordem de execução segue o sistema de prioridade do Symfony — passe um inteiro de prioridade como o segundo elemento da tupla do manipulador em getSubscribedEvents() se a ordem for importante:
Última atualização
Isto foi útil?