Entidades
"A plataforma inteira é desenvolvida em torno de seis entidades principais: Agentes, Espaços, Eventos, Projetos, Oportunidades e Inscrições"
Last updated
Was this helpful?
"A plataforma inteira é desenvolvida em torno de seis entidades principais: Agentes, Espaços, Eventos, Projetos, Oportunidades e Inscrições"
Last updated
Was this helpful?
O Mapas Culturais utiliza o como ORM. Para o Doctrine, as entidades representam um mapeamento entre o modelo orientado a objetos e o modelo relacional do banco de dados.
Uma classe de entidade representa uma tabela. Enquanto uma instância dessa classe representa uma entrada nesta tabela.
O Mapas Culturais implementa na classe uma abstração em cima das entidades do Doctrine.
Essa implementação ocorre de modo a facilitar a validação da entidade, as operações CRUD e, ao mesmo tempo, cuidar das permissões, impedindo que um usuário faça operações e/ou visualize informações que ele não tem permissão. Todas as entidades do mapas estendem esta classe.
Para inserir uma nova entrada em uma tabela, ou em outras palavras, criar um novo objeto de uma determinada entidade, deve-se instanciar um novo objeto da classe desejada, definir ao menos os atributos obrigatórios e chamar o método save
do objeto.
Você pode também, antes de salvar, verificar se há erros de validação no objeto.
Para recuperar um objeto do banco de dados você deve utilizar o repositório da entidade.
O repositório da entidade pode ser acessado pelo método repo
da aplicação.
Para modificar um objeto após recuperá-lo do banco de dados, você deve modificar suas propriedades e utilizar o método save
.
Para deletar um objeto você deve utilizar o método delete
, do mesmo:
Considerando que usuário não está autenticado, o exemplo abaixo disparará a exceção no momento da execução do save(true)
:
Ou do delete:
O mesmo acontece quando um usuário tenta modificar ou apagar um objeto que não lhe pertence e ao qual ele não tem controle.
As permissões são implementadas em funções com o prefixo canUser
(por exemplo, canUserModify
), e podem ser verificadas através do método canUser
da entidade.
Os métodos canUser
recebem o usuário ao qual a permissão está sendo testada e devem ser implementados como protegidos:
Pode-se verificar a permissão antes de efetuar uma operação utilizando o método checkPermission
, que dispara uma exceção de PermissionDenied
quando o método canUser
da permissão retornar false. Esta função é muito útil nos controladores, como veremos no próximo capítulo.
@todo
Como falado anteriormente, cada entidade principal, agentes, espaços, eventos, projetos, oportunidades e inscrições, conta com uma entidade secundária auxiliar para salvamento de metadados. Diferentemente das outras entidades auxiliares, que veremos em seguida.
Para cada entidade principal temos uma tabela própria para a entidade secundária, por exemplo, temos uma tabela agent_meta
para salvar os metadados dos agentes. A estrutura dessas entidades é a seguinte:
id
: int;
key
: string;
value
: string;
owner
: tipo da entidade principal, ou seja Agent, Space, Event, Project, Opportunity ou Registration (mapeado para a coluna object_id
).
Os metadados das entidades precisam ser registrados antes de serem utilizados. No método register
de plugins ou temas, podemos registrar metadados da seguinte maneira:
Os seguintes métodos estão disponíveis para utilização em Plugins, Módulos e Temas:
registerAgentMetadata
;
registerEventMetadata
;
registerOpportunityMetadata
;
registerProjectMetadata
;
registerRegistrationMetadata
;
registerSealMetadata
;
registerSpaceMetadata
;
registerUserMetadata
.
Após registrar o metadado, você pode utilizá-lo como se fosse um atributo do objeto, usando a chave registrada diretamente:
É importante utilizar os metadados dessa maneira, pois é nesta implementação que é feita a verificação das permissões para visualização dos metadados privados.
Ou seja, acessar os metadados através do getter getMetadata
NÃO é uma boa prática
Uma vez registrada uma taxonomia, você pode acessar e definir os termos que uma entidade principal utiliza desta taxonomia da seguinte maneira, utilizando como exemplo a taxonomia tag
:
A operação do exemplo acima adicionará uma entrada na tabela term
para o termo mapas da taxonomia tag
, isso ocorre somente se ainda não houver o termo. E, adicionará outra entrada na tabela term_relation
relacionando o termo criado ao agente.
Cada entidade que utiliza o trait EntityFiles tem uma entidade auxiliar, por exemplo, a entidade Agent
tem a entidade auxiliar AgentFile
que tem a propriedade owner
do tipo Agent
.
Além disso, a entidade principal recebe do trait alguns métodos gets que auxiliam a obtenção dos arquivos anexos. O principal deles é o getFiles
, acessível pelo magic getter por ->files
.
Os seguintes traits estão disponíveis e são utilizados nas diversas entidades:
Para se aprofundar nas entidades vale a leitura da documentação do Doctrine. Lembrando que o Mapas faz uma abstração em cima do Doctrine.
O sistema de permissões do Mapas Culturais é implementado no nível do modelo. Esta abordagem auxilia na prevenção de bugs, uma vez que o controle do que um usuário pode ver, criar, modificar, ou deletar, acontece automaticamente, disparando uma exceção quando uma operação não permitida for executada.
A implementação das taxonomias é feita em torno das entidades e , e do trait .
A funcionalidade de anexar arquivos nas entidades é implementada pela entidade secundária e pelos traits , que implementa a parte do modelo. E, pelo que automatiza os uploads dos arquivos.
: Implementa a funcionalidade de relacionar agentes na entidade. É utilizado por todas as entidades onde é preciso definir administradores para conceder permissão de controle sobre a entidade;
: Implementa a funcionalidade de arquivar e desarquivar uma entidade (Entity::STATUS_ARCHIVE = -2
). É utilizado nas entidades principais;
: Implementa um getter para o grupo de arquivos avatar
. É utilizado pelas entidades que têm a funcionalidade de avatar;
: Implementa a funcionalidade de entidades em rascunho. É utilizado pelas entidades principais;
: Implementa a funcionalidade de arquivos anexos às entidades;
: Implementa a funcionalidade de geolocalização. É utilizado nas entidades Agent
e Space;
: Implementa a funcionalidade de listas (links e vídeos);
: Implementa os metadados para os agentes. É utilizado pelas entidades que possuem a entidade secundária auxiliar para salvamento de metadados;
: Implementa a funcionalidade de entidades hierárquicas. É utilizado pelas entidades com a propriedade parent
, ou seja, Agent
, Space
, Project
e Opportunity
;
: Implementa um getter para retornar as oportunidades vinculadas a entidade. Utilizado nas entidades Agent
, Space
, Project
e Event
;
: Implementa nas entidades métodos relacionados ao SaaS. É utilizado nas entidades que têm a propriedade subsite
, mapeamento para a coluna subsite_id
;
: Implementa a funcionalidade de agente proprietário da entidade. É utilizado pelas entidades que têm um agente owner
("Assinado por", no rodapé da página);
: Implementa a funcionalidade de cache de permissão para a entidade. Como esse cache só é utilizado pela API de busca do Mapas Culturais, este trait é utilizado pelas entidades que disponibilizam a API ou que são utilizadas nas queries da API, a saber, Agent
, EvaluationMethodConfiguration
, Event
, Notification
, Opportunity
, Project
, Registration
, Request
, Seal
e Space
;
: Implementa a funcionalidade de revisões para as entidades. É utilizada nas entidades Agent
, Space
, Registration
e RegistrationEvaluation
;
: Implementa a funcionalidade da aplicação de selos nas entidades. Utilizado em Agent
, Event
, Opportunity
, Project
e Space
;
: Implementa o soft delete (lixeira) para as entidades. Utilizado em Agent
, Event
, Opportunity
, Project
, Seal
, Space
, Subsite
e UserApp
;
: Implementa a funcionalidade de aplicar termos de taxonomias (tags, linguagem e área de atuação) nas entidades. Utilizado nas entidades Agent
, Event
, Opportunity
, Project
e Space
;
: Implementa o campo type
nas entidades. Utilizado em Agent
, EvaluationMethodConfiguration
, Event
, Opportunity
, Project
e Space
.