Introdução
O intuito deste primeiro primeiro capítulo é preparar o desenvolvedor para a jornada que se inicia.
Considera-se como requisitos, que o desenvolvedor possua conhecimento ao menos intermediário de PHP, de orientação a objetos e de Git e SQL (PostgresSQL).
O desenvolvedor deve possuir o docker e o docker-compose funcionando em seu computador, de preferência em ambiente Linux ou MacOS.
Tecnologias Envolvidas
No backend, o Mapas Culturais é desenvolvido em PHP utilizando o Slim v2 como microframework e o Doctrine como ORM, entre outras bibliotecas como o Respect\Validation.
No frontend, são utilizados o AngularJS, X-editable e leaflet, entre outras bibliotecas.
Entidades Principais, Auxiliares e Diagrama de Relacionamento de Entidade
A plataforma inteira é desenvolvida em torno de seis entidades principais, a saber:
Agent: Agentes;
Space: Espaços;
Event: Eventos;
Project: Projetos;
Opportunity: Oportunidades;
Registration: Inscrições.
Cada uma das entidades principais conta com uma entidade auxiliar para salvamento de metadados (AgentMeta, SpaceMeta, EventMeta, ProjectMeta, OpportunityMeta e RegistrationMeta).
E, também, conta com as entidades secundárias, que auxiliam no desenvolvimento das funcionalidades, como as mais importantes, listadas abaixo:
File: Arquivos;
Term e TermRelation: Termos de taxonomias;
AgentRelation: Agentes relacionados;
PermissionCache e PermissionCachePending: Cache de permissão.
Diagrama de Relacionamento de Entidade
Subindo Ambiente de Desenvolvimento
Após clonar o repositório do Mapas Culturais, entre, pela linha de comando na pasta dev-scripts, e execute o script start-dev.sh.
Este script utiliza o Docker Compose para iniciar o ambiente utilizando o Dockerfile de desenvolvimento, que é baseado no php7.2-cli e se utiliza do built-in web server do PHP. Assim, possibilitando a utilização do PsySH no desenvolvimento.
Após a inicialização, a aplicação constará rodando e ouvindo a porta 80 de seu computador. Acesse http://localhost/ em seu navegador.
Script shell.sh
e breakpoint com eval(\psy\sh())
shell.sh
e breakpoint com eval(\psy\sh())
E, também, na pasta dev-scripts
, há o script shell.sh
que inicializa um console para debug interativo da aplicação, contendo algumas funções auxiliares para facilitar o debug da aplicação, como a função login
. Para executar este script é necessário que a aplicação já esteja rodando com o script start-dev.sh
.
É possível definir breakpoints em qualquer ponto do código, pausando a execução e abrindo o console de debug na linha de comando. Basta adicionar o código eval(\psy\sh());
no ponto desejado do código.
No exemplo abaixo, o código foi colocado na linha 32 do Site Controller:
Para sair do console e continuar a execução do script, utilize o comando exit
ou pressione Ctrl+d
.
Recomenda-se ler a documentação do PsySH, especialmente a parte que descreve os comandos. Abaixo, alguns comandos úteis:
ls
els -l
: Lista as variáveis acessíveis no escopo;trace
: Exibe o stack até o ponto do código;doc {target}
: Exibe a documentação do {target}, onde {target} pode ser uma função, classe ou objeto;help
ou?
: Exibe a lista dos comandos disponíveis.
Pode-se inspecionar uma variável digitando o nome dela, por exemplo, o $app->plugins
, um array com as instâncias dos plugins ativos no ambiente:
Ciclo de Vida da Aplicação
Todas as requisições se iniciam no arquivo src/index.php, arquivo responsável por fazer o Bootstrap da aplicação.
O Bootstrap define uma série de constantes, inicializa o autoloader de classes, lê o arquivo de configuração, instancia e inicializa o objeto da aplicação e executa aplicação.
Durante a inicialização da aplicação são executadas as seguintes operações, nesta ordem:
Inicialização da sessão;
Inicialização dos caches da aplicação;
Registro do autoloader de classes de plugins e temas;
Inicialização do Doctrine;
Instanciação do tema;
Instanciação do Slim;
Inicialização dos plugins;
Inicialização dos módulos;
Inicialização do logger;
Inicialização do storage driver;
Inclusão dos middlewares;
Inicialização do gerenciador de rotas;
Registro de:
Metadados e tipos de entidade;
Controladores;
Roles;
Grupos de arquivos;
Tamanhos de imagens;
Grupos de metalist;
Taxonomias;
Execução dos registros dos módulos e plugins.
Inicialização do autenticador;
Inicialização do tema.
Após a inicialização, a requisição é encaminhada para o gerenciador de rotas que decidirá para qual controller e action a requisição seguirá.
Uma vez no controlador, este poderá renderizar uma visão utilizando o método $this->render('template-name');
; poderá retornar um JSON utilizando o método $this->json(['data' => 'value']);
; um JSON de erro utilizando o método $this->errorJson(['errorData' => 'value'], 400);
; um 404 utilizando $app->pass()
; uma permissão negada utilizando throw new \MapasCulturais\Exceptions\PermissionDenied
; etc.
Visão Geral dos Hooks
Hooking (enganchar em inglês) é a forma que o Mapas Culturais oferece ao desenvolvedor para que ele possa alterar ou estender o comportamento padrão da aplicação, sem que para isso, ele precise modificar seu código.
Há hooks espalhados por toda a aplicação e estes estão divididos basicamente em dois grandes grupos: os hooks de template (template hooks), que como o nome diz são definidos nos arquivos de template dos temas, plugins ou módulos, e os hooks da aplicação, que são definidos no core da aplicação.
Template Hooks
Os template hooks são definidos chamando o método applyTemplateHook
do tema, que recebe dois parâmetros para nomear o hook, $name
e $sufix
, além dos argumentos que serão passados para o callback enganchado. Os hooks definidos por este método receberão o nome template(controllerId.actionName.nome-do-hook):sufix
. Costuma-se utilizar quatro sufixos para cada nome de hook: before
, begin
, end
e after
, como no exemplo abaixo, possibilitando que sejam incluídos código antes, no início, no fim ou depois da div:
Hooks da Aplicação
Os hooks da aplicação são os que estão espalhados nas classes do core do Mapas Culturais. Estes são definidos utilizando os métodos applyHook
ou applyHookBoundTo
da aplicação (classe MapasCulturais\App
).
Habilitando logs de hook
Para habilitar o log dos hooks chamados na requisição, utilize a chave de configuração app.log.hook
da seguinte maneira:
true
: Para habilitar o log de todos os hooks;'agent'
: Habilita o log de todos os hooks que tenham a palavraagent
;'(agent|space).save'
: Habilita log para os hooks que contenhamagent.save
ouspace.save
. a configuração aceita expressões regulares e é case sensitive.
Utilizando os hooks
Costuma-se utilizar os hooks no método _init
do tema, módulo ou plugin para adicionar um texto no início da div#minha-div
na home da aplicação (controller Site
, action GET_index
), como no exemplo abaixo:
MagicGetter e MagicSetter
O Mapas Culturais implementa em dois traits os métodos mágicos __get e __set, da maneira exemplificada abaixo:
Last updated