Introdução
O intuito deste primeiro primeiro capítulo é preparar o desenvolvedor para a jornada que se inicia.
Last updated
O intuito deste primeiro primeiro capítulo é preparar o desenvolvedor para a jornada que se inicia.
Last updated
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.
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.
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.
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.
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
e ls -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:
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.
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.
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:
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
).
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 palavra agent
;
'(agent|space).save'
: Habilita log para os hooks que contenham agent.save
ou space.save
. a configuração aceita expressões regulares e é case sensitive.
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:
O Mapas Culturais implementa em dois traits os métodos mágicos __get e __set, da maneira exemplificada abaixo: