Modelando entidades e variáveis na rota com Symfony

André Chaves
Code Maestro
Published in
5 min readFeb 19, 2018

--

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:

classe Funcionario

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:

método que retorna o tempo na empresa

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:

controller da classe funcionário

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:

action para mostrar um funcionário

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:

instância de funcionário

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!

metodo render com funcionario

Agora, só falta um twig que receba esse funcionário:

mostra.html.twig do 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:

action mostra

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

rota com variável

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:

recebendo a variável da rota na action

Acessando a url dinâmica

Agora, ao acessarmos a url:

localhost:8000/funcionario/mostra/João Da Silva

Temos o resultado dinâmico:

resultado da action /funcionario/mostra/JoãoDaSilva

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 =)

--

--

André Chaves
Code Maestro

Empreendedor, CTO, desenvolvedor e apaixonado por automação.