Introdução
O intuito deste primeiro primeiro capítulo é preparar o desenvolvedor para a jornada que se inicia.
Last updated
Was this helpful?
O intuito deste primeiro primeiro capítulo é preparar o desenvolvedor para a jornada que se inicia.
Last updated
Was this helpful?
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.
A plataforma inteira é desenvolvida em torno de seis entidades principais, a saber:
E, também, conta com as entidades secundárias, que auxiliam no desenvolvimento das funcionalidades, como as mais importantes, listadas abaixo:
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
.
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:
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.
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:
No backend, o Mapas Culturais é desenvolvido em PHP utilizando o como microframework e o como ORM, entre outras bibliotecas como o .
No frontend, são utilizados o , e , entre outras bibliotecas.
: Agentes;
: Espaços;
: Eventos;
: Projetos;
: Oportunidades;
: Inscrições.
Cada uma das entidades principais conta com uma entidade auxiliar para salvamento de metadados (, , , , e ).
: Arquivos;
e : Termos de taxonomias;
: Agentes relacionados;
e : Cache de permissão.
Após clonar o do Mapas Culturais, entre, pela linha de comando na pasta , e execute o script .
Este script utiliza o Docker Compose para iniciar o ambiente utilizando o , que é baseado no php7.2-cli e se utiliza do built-in web server do PHP. Assim, possibilitando a utilização do no desenvolvimento.
Após a inicialização, a aplicação constará rodando e ouvindo a porta 80 de seu computador. Acesse em seu navegador.
Recomenda-se ler a , especialmente a parte que descreve os . Abaixo, alguns comandos úteis:
Todas as requisições se iniciam no arquivo , arquivo responsável por fazer o Bootstrap da aplicação.
O Bootstrap define uma série de , inicializa o de classes, lê o arquivo de , o objeto da aplicação e .
Após a inicialização, a requisição é encaminhada para o que decidirá para qual .
O Mapas Culturais implementa em dois os métodos mágicos e , da maneira exemplificada abaixo: