(16) 981791110 contato@policast.studio

Introdução

Um sistema de agendamento de transporte é uma ferramenta importante para empresas de transporte que desejam gerenciar melhor suas operações e reduzir a chance de atrasos e cancelamentos. Com o Symfony, é possível criar um sistema de agendamento de transporte robusto e eficiente. Neste artigo, ensinaremos a controlar e agendar horários de saída e de chegada de meios de transporte usando recursos do Symfony.

Anatomia do sistema de agendamento de transporte

Antes de começar a criar o sistema, é importante entender seus componentes. O sistema de agendamento de transporte deve permitir o cadastro de meios de transporte (ônibus, avião, trem etc.), rotas entre cidades, horários de saída e de chegada de cada meio de transporte, além de permitir a visualização dos horários disponíveis para uma determinada rota.

Criando os modelos

Para começar a construir o sistema, é preciso criar modelos que representem as entidades do domínio. No Symfony, a forma mais fácil de criar esses modelos é utilizando o Doctrine.

O primeiro modelo a ser criado deve ser o de meios de transporte. Crie uma nova entidade e adicione os campos necessários, como nome, tipo de transporte (ônibus, avião etc.) e capacidade de passageiros.


/**
* @ORMEntity
*/
class Transporte
{
/**
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
* @ORMColumn(type="integer")
*/
private $id;

/**
* @ORMColumn(type="string", length=100)
*/
private $nome;

/**
* @ORMColumn(type="string", length=100)
*/
private $tipo;

/**
* @ORMColumn(type="integer")
*/
private $capacidade;

//getters e setters
}

Depois de criar o modelo de meios de transporte, é preciso criar o modelo de rotas. Crie uma nova entidade e adicione os campos necessários, como origem, destino e distância.


/**
* @ORMEntity
*/
class Rota
{
/**
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
* @ORMColumn(type="integer")
*/
private $id;

/**
* @ORMColumn(type="string", length=100)
*/
private $origem;

/**
* @ORMColumn(type="string", length=100)
*/
private $destino;

/**
* @ORMColumn(type="float")
*/
private $distancia;

//getters e setters
}

Por fim, é preciso criar o modelo de horários de saída e chegada. Crie uma nova entidade e adicione os campos necessários, como horário de saída, horário de chegada, meio de transporte, rota e número de assentos disponíveis.


/**
* @ORMEntity
*/
class Horario
{
/**
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
* @ORMColumn(type="integer")
*/
private $id;

/**
* @ORMColumn(type="datetime")
*/
private $horario_saida;

/**
* @ORMColumn(type="datetime")
*/
private $horario_chegada;

/**
* @ORMManyToOne(targetEntity="Transporte")
* @ORMJoinColumn(nullable=false)
*/
private $transporte;

/**
* @ORMManyToOne(targetEntity="Rota")
* @ORMJoinColumn(nullable=false)
*/
private $rota;

/**
* @ORMColumn(type="integer")
*/
private $assentos_disponiveis;

//getters e setters
}

Criando os formulários

Com os modelos criados, é preciso criar os formulários para a inserção dos dados. No Symfony, é possível criar os formulários de forma rápida e simples.

Começaremos pelo formulário de cadastro de meios de transporte. Crie uma nova classe que estenda a classe Form do Symfony e adicione os campos necessários.


class TransporteType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nome')
->add('tipo', ChoiceType::class, [
'choices' => [
'Ônibus' => 'onibus',
'Avião' => 'aviao',
'Trem' => 'trem'
]
])
->add('capacidade');
}

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Transporte::class,
]);
}
}

Para o formulário de cadastro de rotas, crie uma nova classe que estenda a classe Form do Symfony e adicione os campos necessários.


class RotaType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('origem')
->add('destino')
->add('distancia');
}

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Rota::class,
]);
}
}

Por fim, para o formulário de cadastro de horários de saída e chegada, crie uma nova classe que estenda a classe Form do Symfony e adicione os campos necessários.


class HorarioType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('horario_saida', DateTimeType::class)
->add('horario_chegada', DateTimeType::class)
->add('transporte', EntityType::class, [
'class' => Transporte::class,
'choice_label' => 'nome'
])
->add('rota', EntityType::class, [
'class' => Rota::class,
'choice_label' => 'origem'
])
->add('assentos_disponiveis');
}

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Horario::class,
]);
}
}

Criando as rotas e controladores

Com os modelos e formulários criados, é preciso criar as rotas e controladores para as operações de CRUD (create, read, update, delete).

Para a tela de listagem de meios de transporte, crie uma nova rota que renderize a view com a lista de transportes.


/**
* @Route("/transportes", name="transportes_index")
* @param Request $request
* @param TransporteRepository $transporteRepository
* @return Response
*/
public function index(Request $request, TransporteRepository $transporteRepository): Response
{
$transportes = $transporteRepository->findAll();

return $this->render('transportes/index.html.twig', [
'transportes' => $transportes
]);
}

Em seguida, crie uma view para exibir a lista de transportes.


{# templates/transportes/index.html.twig #}
{% extends 'base.html.twig' %}

{% block content %}

Lista de meios de transporte

{% for transporte in transportes %}

{% endfor %}

Nome Tipo Capacidade
{{ transporte.nome }} {{ transporte.tipo }} {{ transporte.capacidade }}

{% endblock %}

Repita o mesmo processo para as listagens de rotas e horários.


/**
* @Route("/rotas", name="rotas_index")
* @param Request $request
* @param RotaRepository $rotaRepository
* @return Response
*/
public function index(Request $request, RotaRepository $rotaRepository): Response
{
$rotas = $rotaRepository->findAll();

return $this->render('rotas/index.html.twig', [
'rotas' => $rotas
]);
}


/**
* @Route("/horarios", name="horarios_index")
* @param Request $request
* @param HorarioRepository $horarioRepository
* @return Response
*/
public function index(Request $request, HorarioRepository $horarioRepository): Response
{
$horarios = $horarioRepository->findAll();

return $this->render('horarios/index.html.twig', [
'horarios' => $horarios
]);
}

Para as telas de criação e edição, crie rotas que renderizem os formulários correspondentes. No caso do formulário de horários de saída e chegada, é necessário passar uma lista de meios de transporte e rotas para o formulário.


/**
* @Route("/transportes/adicionar", name="transportes_adicionar")
* @param Request $request
* @return Response
*/
public function adicionar(Request $request): Response
{
$transporte = new Transporte();
$form = $this->createForm(TransporteType::class, $transporte);

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($transporte);
$entityManager->flush();

return $this->redirectToRoute('transportes_index');
}

return $this->render('transportes/adicionar.html.twig', [
'form' => $form->createView()
]);
}


/**
* @Route("/rotas/adicionar", name="rotas_adicionar")
* @param Request $request
* @return Response
*/
public function adicionar(Request $request): Response
{
$rota = new Rota();
$form = $this->createForm(RotaType::class, $rota);

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($rota);
$entityManager->flush();

return $this->redirectToRoute('rotas_index');
}

return $this->render('rotas/adicionar.html.twig', [
'form' => $form->createView()
]);
}


/**
* @Route("/horarios/adicionar", name="horarios_adicionar")
* @param Request $request
* @param TransporteRepository $transporteRepository
* @param RotaRepository $rotaRepository
* @return Response
*/
public function adicionar(Request $request, TransporteRepository $transporteRepository, RotaRepository $rotaRepository): Response
{
$horario = new Horario();
$form = $this->createForm(HorarioType::class, $horario, [
'transportes' => $transporteRepository->findAll(),
'rotas' => $rotaRepository->findAll()
]);

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($horario);
$entityManager->flush();

return $this->redirectToRoute('horarios_index');
}

return $this->render('horarios/adicionar.html.twig', [
'form' => $form->createView()
]);
}

Por fim, crie rotas que permitam a edição e exclusão de cada entidade.


/**
* @Route("/transportes/editar/{id}", name="transportes_editar", methods={"GET","POST"})
* @param Request $request
* @param Transporte $transporte
* @return Response
*/
public function editar(Request $request, Transporte $transporte): Response
{
$form = $this->createForm(TransporteType::class, $transporte);

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
$this->getDoctrine()->getManager()->flush();

return $this->redirectToRoute('transportes_index');
}

return $this->render('transportes/editar.html.twig', [
'transporte' => $transporte,
'form' => $form->createView()
]);
}


/**
* @Route("/rotas/editar/{id}", name="rotas_editar", methods={"GET","POST"})
* @param Request $request
* @param Rota $rota
* @return Response
*/
public function editar(Request $request, Rota $rota): Response
{
$form = $this->createForm(RotaType::class, $rota);

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
$this->getDoctrine()->getManager()->flush();

return $this->redirectToRoute('rotas_index');
}

return $this->render('rotas/editar.html.twig', [
'rota' => $rota,
'form' => $form->createView()
]);
}


/**
* @Route("/horarios/editar/{id}", name="horarios_editar", methods={"GET","POST"})
* @param Request $request
* @param Horario $horario
* @param TransporteRepository $transporteRepository
* @param RotaRepository $rotaRepository
* @return Response
*/
public function editar(Request $request, Horario $horario, TransporteRepository $transporteRepository, RotaRepository $rotaRepository): Response
{
$form = $this->createForm(HorarioType::class, $horario, [
'transportes' => $transporteRepository->findAll(),
'rotas' => $rotaRepository->findAll()
]);

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
$this->getDoctrine()->getManager()->flush();

return $this->redirectToRoute('horarios_index');
}

return $this->render('horarios/editar.html.twig', [
'horario' => $horario,
'form' => $form->createView()
]);
}

Conclusão

Criar um sistema de agendamento de transporte com Symfony é simples e eficiente. Com os recursos do framework, é possível criar modelos, formulários, rotas e controladores que tornam a criação do sistema uma tarefa tranquila e rápida. Com as dicas fornecidas neste artigo, você estará pronto para criar seu próprio sistema de agendamento de transporte com Symfony.