Controladores
Last updated
Last updated
Os controladores são instâncias de classes que estendem a classe abstrata MapasCulturais\Controler e precisam ser registrados na aplicação.
Para registrar um controlador, deve-se utilizar o método App::registerController
, dando um id e a classe do controlador. Este registro deve ser feito no método register
dos temas, plugins ou módulos.
Abaixo, o exemplo de registro do controller de classe Teste
com o id teste
:
Registrado o controller, é possível acessar a rota padrão (GET_index) pelo id registrado: http://localhost/teste/
.
Para criar uma rota basta criar um método utilizando o tipo de requisição (GET_
, POST_
, PUT_
, PATCH_
e DELETE_
), como prefixo. Para aceitar qualquer tipo de requisição, deve-se utilizar o prefixo ALL_
.
A classe abstrata MapasCulturais\Controler contém o seguinte método utilizado para retornar JSONs, este pode ser utilizado em qualquer dos controllers:
Então, para retornar um JSON basta invocar este método passando como primeiro parâmetro os dados a serem codificados como JSON. E como segundo parâmetro opcional, o código http de retorno da requisição.
404: Para retornar um erro 404, deve-se utilizar o método App::pass
.
JSON de erro: Para retornar um erro em formato JSON, utiliza-se o método errorJson
do controller, informando os dados a serem codificados e o código http de retorno da requisição, como no exemplo a seguir:
Erro customizado: Para retornar um erro customizado, utiliza-se o método halt
da aplicação:
As visões são arquivos de template que ficam dentro da pasta views/{$controller_slug}
do tema, módulo ou plugin, onde $controller_slug, por padrão, é o id do controller.
Para renderizar uma visão, utiliza-se o método render
do controlador, que deve receber como primeiro parâmetro obrigatório o nome do arquivo de template e, como segundo parâmetro opcional, um array com as variáveis a serem enviadas à visão, como no exemplo a seguir:
O arquivo de visão views/lista.php
:
O EntityController é uma classe abstrata que implementa uma série de métodos e endpoints para manipular as entidades:
POST_index
: Endpoint para criação de entidades;
PUT_single
: Endpoint para substituição da entidade (na prática acontece um update na entidade);
PATCH_single
: Endpoint para atualização da entidade;
DELETE_single
: Deleta a entidade;
POST_validateProperties
: Valida os campos enviados, sem considerar os campos não enviados;
POST_validateEntity
: Valida a entidade completa, considerando inclusive os campos não enviados;
GET_propertiesMetadata
: Retorna JSON com os metadados (descrição) dos campos da entidade;
GET_single
: Renderiza a single (página de visualização) da entidade;
GET_edit
: Renderiza a página de edição das entidades.
Se houver um parâmetro id na URL após o nome da rota, como nos exemplos abaixo, é possível pedir a entidade requisitada para o controlador:
A grande maioria das rotas da aplicação requerem que o usuário esteja autenticado e em muitas há uma checagem de permissão do usuário. As exceções costumam ser as páginas onde há somente a leitura de informações públicas.
Para requerer a autenticação basta chamar o método requireAuthentication
do controlador, normalmente, na primeira linha do método, como no exemplo a seguir:
Este método fará um redirect do usuário não autenticado para a página de login, retornando após a autenticação para a rota original. Caso o usuário já esteja autenticado o método não fará ação alguma.
É comum que mesmo o usuário estando autenticado, ele não tenha permissão para realizar uma operação em uma entidade. Por exemplo, um usuário não pode deletar um agente de outro usuário.
Como o sistema de permissões é implementado no nível do modelo, basta chamar o método checkPermission
da entidade, informando a permissão a ser verificada.
Abaixo, a implementação completa do endpoint dumpEntity
com requerimento de autenticação e com checagem de permissão:
Neste exemplo, se o usuário não tiver permissão para ver os dados privados da entidade (método canUserViewPrivateData
definido no trait EntityMetadata), será retornado um erro 403 para o usuário.
ControllerAPI: Implementa os endpoints da API de busca do MapasCulturais (endpoints /api/{entity}/find
, /api/{entity}/findOne
e /api/{entity}/describe
);
ControllerAPINested: Implementa o endpoint /api/{entity}/getChildrenIds
. Utilizado pelos controladores de entidades que utilizam o trait EntityNested
;
ControllerAgentRelation: Implementa os endpoints para manipulação dos agentes relacionados. Utilizado pelos controladores de entidades que utilizam o trait EntityAgentRelation
;
ControllerArchive: Implementa os endpoints para arquivar e desarquivar entidades. Utilizado pelos controladores de entidades que utilizam o trait EntityArchive
;
ControllerChangeOwner: Implementa os endpoints para mudança de propriedade (ownerAgent) das entidades. Utilizado pelos controladores de entidades que utilizam o trait EntityOwnerAgent
;
ControllerDraft: Implementa os endpoints para a funcionalidade entidades em rascunho. Utilizado pelos controladores de entidades que utilizam o trait EntityDraft
;
ControllerMetaLists: Implementa os endpoints para manipulação dos MetaLists. Utilizado pelos controladores de entidades que utilizam o trait EntityMetalist
;
ControllerOpportunities: Implementa o endpoint para criação de oportunidade. Utilizado pelos controladores de entidades que utilizam o trait EntityOpportunities
;
ControllerSealRelation: Implementa os endpoints para manipulação dos selos relacionados às entidades. Utilizado pelos controladores de entidades que utilizam o trait EntitySeals
;
ControllerSoftDelete: Implementa os endpoints para a funcionalidade de lixeira das entidades. Utilizado pelos controladores de entidades que utilizam o trait EntitySoftDelete
;
ControllerTypes: Implementa os endpoints /api/{entity}/getTypes
e /api/{entity}/getTypeGroups
. Utilizado pelos controladores de entidades que utilizam o trait EntityTypes
;
ControllerUploads: Implementa o upload de arquivos. Utilizado pelos controladores de entidades que utilizam o trait EntityFiles
.
Para utilizar o trait ControllerUploads
é necessário registrar os grupos de arquivos utilizando o método App::registerFileGroup
.
O Mapas Culturais registra, por padrão, quatro grupos para as entidades principais: downloads
, header
, avatar
e gallery
.
Registrado o grupo, pode-se fazer upload do arquivo utilizando um campo file com o nome registrado: