Anteriormente, criamos a entidade Post, vamos dar continuidade ao nosso simples projeto, criando uma entidade Author, faremos o relacionamento para que cada autor fique ligado ao post que criou.
Criando a entidade Author
Vamos criar a entidade Author, entre no terminal e digite:
Vamos digitar o nome da entidade como : TablelessModelBundle:Author.
Vamos mapeá-la usando annotation. Apenas damos enter.
O assistente nos pergunta: Qual será o nome do nosso campo?
Digitamos “name” e damos enter.
Será do tipo string.
Com o tamanho de 100.
Quando o assistente nos perguntar novamente: Qual será o novo campo? Damos enter para entrarmos no processo de finalização. E nos pergunta, se queremos criar uma classe de repositório, ele nos indica não, vamos apenas dar um enter.
E para finalizar, o assistente pergunta se realmente queremos gerar a entidade. Como queremos, digitamos apenas enter.
Nossa entidade Author está pronta.
Ao entrarmos na pasta src/Tableless/ModelBundle/Entity/ vamos encontrá-la.
Agora devemos adicionar a annotations, @ORMTable(name=”author”) para o nome da nossa tabela, veja na linha 10:
Veja toda a entidade Author:
Configurando o projeto
Nesse momento vamos criar uma classe abstrata com o nome Timestampable, para que não fiquemos repetindo código, pois entidade Author também receberá uma data de criação e data de atualização.
Vamos lá!
Entre na pasta src/Tableless/ModelBundle/Entity/, e vamos criar uma classe abstrata com o nome Timestampable, para que possamos mapeá lá vamos usar a classe do Doctrine Mapping e vamos dar um apelido de ORM, e fazer as annotations correspondentes.
Nesse momento, ficar explicando detalhe por detalhe levará muito tempo, e o tutorial ficará extenso, veja a classe Timestampable pronta abaixo:
Vamos estender essa classe na entidade Author, veja abaixo na linha 13:
Temos que validar os campos da entidade Author, vamos dar um use em Constraints e apelidá-la como Assert:
vamos validar o campo name com @AssertNotBlank, veja abaixo:
Veja a entidade Author depois da configuração:
Configurando a entidade Post
Como criamos um classe abstrata, vamos alterar a entidade Post para que ela estenda a entidade Timestampable.
Exclua os atributos $createdAt e $updatedAt e os métodos setCreatedAt(), getCreatedAt(), setUpdatedAt(), getUpdatedAt() e o __contruct(), e vamos estender a classe Timestampable, depois de configurada, a entidade Post ficará assim:
Atualizando o banco de dados
Geramos a entidade Author e alteramos a entidade Post, dessa forma devemos atualizar nosso banco, para que o mesmo fique configurado de acordo com as entidades.
Vamos ao terminal, e para atualizar o banco de dados vamos digitar o código:
Teremos o resultado:
Entrando no banco de dados vamos perceber que a tabela author criada:
Criando o CRUD da entidade Author
Depois da configuração das nossa entidade, vamos gerar o CRUD da entidade Author. Vamos digitar no console:
Digitamos TablelessModelBundle:Author:
O assistente nos pergunta se queremos gerar as ações de gravação, digitamos: yes.
Como vamos configurar? Vamos deixar como está, annotation, e damos enter
Como será a rota? Vamos deixar como ele nos indica, damos enter.
Vamos confirmar a geração desse CRUD dando enter.
Prontinho nosso CRUD da entidade Author está pronto, vamos testar.
Inicie o servidor:
entre na url:
https://127.0.0.1:8000/author/
Vamos criar um autor com o nome Tableless
Vamos fazer um relacionamento no banco de dados, pois queremos que, ao criarmos um post, o mesmo esteja relacionado com o autor que o criou. Não entraremos em detalhes sobre relacionamento, caso tenha dúvidas, consulte a documentação.
Vamos configurar novamente as entidades para que o relacionamento possa acontecer.
Entre na entidade Post e acrescente o atributo $author com as seguintes annotations:
Entre na entidade Author e acrescente o atributo $post, com as seguintes annotations:
Precisamos também dar um use na classe ArrayCollection, do Doctrine, pois um autor terá vários posts, e os posts serão buscados como array, insira o código:
Vamos criar um construtor, porém a entidade Timestampable já tem um construtor, para resolver esse problema, vamos adicionar um parent::__construct(), veja abaixo:
Agora vamos gerar os métodos necessários da entidade Author, entre no console e digite:
Temos que gerar também para a entidade Post:
Entre novamente na entidade Author e acrescente o método abaixo no final da entidade:
Veja como ficou a entidade Author depois de configurarmos:
Veja a entidade Post, após a configuração:
Agora vamos atualizar o banco de dados para gerar o relacionamento, para isso apague todo o conteúdo das tabelas do banco de dados, caso não o faça, ocorrerá erro,
Após apagar o conteúdo do banco, rode o comando no console:
Corrigindo os formulários
Entre na classe PostType, caminho: src/Tableless/ModelBundle/Form/PostType, e acrescente a linha abaixo, no método buildForm:
Também vamos apagar as linhas:
Pois não precisamos inserir as datas, em que o post foi criado, ou alterado, isso acontecerá automaticamente!
Depois das modificações, o método formBuilder ficará como abaixo:
Tudo configurado para que possamos criar nossos posts.
Para verificarmos se está tudo correto, precisamos criar primeiramente um autor, depois criamos um post, onde teremos que selecionar um autor, para o mesmo.
Veja abaixo:
Lembrando que a url de autor é:
https://127.0.0.1:8000/author/
e a url de post é:
https://127.0.0.1:8000/post/
Conclusão
Vamos terminar este tutorial, pois seu conteúdo está muito extenso, no próximo, vamos fazer as configurações necessárias em nossa simples aplicação, e vamos criar um index, para mostrar nossos posts, que configuraremos com o Bootstrap, e com o template engine twig. O projeto encontra-se no GitHub!