Modelando entidades e variáveis na rota com Symfony
Criar sistemas do zero requer uma visão bastante apurada da regra de negócio. O que é importante e deve ser representado? Quais atributos criar, quais métodos?
No nosso sistema TikTok® para gestão de horas lançadas por funcionário, temos alguns pontos importantes evidentes:
- Funcionários
- Horas lançadas
- Projetos nos quais os funcionários lançam as horas
Nos próximos posts vamos focar mais no funcionário e em como representá-lo. Para isso precisaremos de rotas mais robustas.
Quando criar uma classe?
Essa é uma pergunta bastante comum nos cursos de orientação a objetos. Nosso foco, aqui, não é muito o conceito mas a modelagem em sí.
Normalmente, o que é bastante importante pra regra de negócio precisa ser representado no sistema de alguma forma.Representar coisas no sistema, quase sempre significa: criar uma classe.
Funcionario, HoraLancada e Projeto com certeza se tornarão classes no sistema pois são extremamente importantes na regra de negócio. Isso varia de projeto para projeto mas a regra costuma funcionar bem pra maioria dos casos.
E o que vai na classe?
Sabendo que Funcionario é importante e que tudo que é importante acaba se tornando uma classe, precisamos pensar:
- O que um funcionário tem? Aqui teremos um atributo
- O que um funcionário faz? Aqui teremos um método
Atributos
Funcionário, a principio, deve com certeza ter um nome, uma data de nascimento e a data em que entrou.
Convertendo essa conclusão para orientação à objetos temos:
Métodos
Agora só falta fazer o calculo do tempo que está na empresa. O tempo que um funcionário existe na empresa é exatamente a diferença entre o dia que ele entrou e o dia de hoje:
Em algum momento, faremos o mesmo processo para HoraLancada e Projeto.
Mãos na massa
Cliente não vê classe, nem código bonito. Por mais que isso impacte o negócio dele diretamente. Por isso, precisamos mostrar um funcionário criado. Nem que seja um esboço.
Isso significa que vamos precisar criar uma view. Se precisamos renderizar uma view, precisamos de um controller que gerencie os dados:
Assim, tudo que for relacionado a funcionário vamos colocar nesse controller.
Mostrando um funcionário
Finalmente, para mostrar uma instância de funcionário precisamos de uma rota. Normalmente, quando falamos de uma entidade deixamos claro na rota. Algo como:
/funcionario/mostra
Criar uma rota assim é simples:
Dados dinâmicos na view
Também precisamos criar um funcionário, com nome, as datas de entrada e nascimento. E, por fim, retornar este funcionário para alguma view:
Mas, dessa vez, apenas renderizar a view não será o suficiente. Precisamos passar o funcionário para essa view, assim podemos trocar os dados quando quisermos.
O segundo parâmetro do método render, recebe justamente um array associativo com os dados dinâmicos que passamos para o twig!
Agora, só falta um twig que receba esse funcionário:
A chave do array associativo, no twig, se torna o nome da nossa variável, para acessar os métodos getters basta um ponto na referência. Para ajudar a imprimir as datas, usamos a função date do próprio twig para formatar =)
Tornando os dados mais dinâmicos
Conseguimos imprimir um funcionário mas criamos todos os dados dele na mão. Uma abordagem legal seria passar o nome pela URL, assim a página teria o conteúdo de acordo com o que a gente quisesse mostrar pro cliente.
Algo como:
/funcionario/mostra/andre chaves
ou
/funcionario/mostra/joao da silva
Isso significa que nossa rota:
Precisa de um terceiro parâmetro variável, um que receba o nome do funcionário.
Criando variáveis na rota
O Symfony suporta variáveis nas rotas especificando entre chaves. Algo como
Assim, qualquer texto que seja passado nesse terceiro parâmetro cairá na nossa rota!
Puxando o valor da variável
Agora só falta a gente dizer que o nome do funcionário é o mesmo que foi passado na url.
Felizmente, o Symfony permite que a gente receba qualquer parâmetro da url como um parâmetro no método! Assim, não precisamos ficar buscando no request:
Acessando a url dinâmica
Agora, ao acessarmos a url:
localhost:8000/funcionario/mostra/João Da Silva
Temos o resultado dinâmico:
Proximos passos
As rotas no Symfony possuem uma infinidade de funcionalidades. Podemos, além de especificar variáveis, dar valores padrões para as variáveis e até criar padrões como expressões regulares(regex).
No próximo post, vamos nos aprofundar um pouco mais no funcionário. Criar um formulário para registrar funcionários no banco de dados e mostrar uma lista!
E ai, o que você achou das rotas com variáveis? E do processo de modelagem? Conhece alguma forma diferente? Compartilha aqui nos comentários!
Ah! O código pronto desse post você pode encontrar versionado no meu git =)