Introdução:
O Symfony é um framework PHP poderoso e flexível que pode ser utilizado para desenvolver diversas aplicações web, incluindo sistemas de gerenciamento de tarefas. Neste tutorial, iremos criar um sistema simples de gerenciamento de tarefas com Symfony, onde os usuários poderão criar tarefas, atribuir tarefas a outros usuários e gerenciar o status das tarefas.
Criação do Banco de Dados:
Antes de começarmos a desenvolver o sistema, precisamos criar um banco de dados para armazenar as informações das tarefas. Para isso, iremos utilizar o Doctrine, um ORM (Object-Relational Mapping) que permite interagir com o banco de dados utilizando objetos em vez de SQL.
Para criar um banco de dados utilizando o Doctrine, basta executar o comando php bin/console doctrine:database:create
no terminal, após a instalação do Symfony. O Doctrine irá criar um banco de dados com o nome definido no arquivo de configuração, geralmente app/config/parameters.yml
.
Criação das Entidades:
As entidades representam as tabelas do banco de dados no mundo dos objetos. No nosso sistema de gerenciamento de tarefas, iremos criar duas entidades: Task (tarefa) e User (usuário). A entidade de usuário será utilizada para a atribuição das tarefas.
Para criar as entidades utilizando o Doctrine, basta executar o comando php bin/console doctrine:generate:entity
no terminal e seguir as instruções. O Doctrine irá criar as classes de entidade, que poderão ser customizadas conforme necessário.
Criação do Formulário de Criação de Tarefas:
Para permitir que os usuários criem tarefas, precisamos criar um formulário que permita a entrada das informações da tarefa. Utilizaremos o Symfony Form Component para criar nosso formulário.
Primeiro, precisamos criar uma classe de formulário para a entidade Task. Esta classe irá definir os campos que serão exibidos no formulário e as validações que serão aplicadas em cada campo.
namespace AppBundleForm;
use AppBundleEntityTask;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
class TaskType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('title')
->add('description')
->add('dueDate', null, ['widget' => 'single_text'])
->add('save', 'submit');
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Task::class,
));
}
}
Em seguida, precisamos criar um controller que irá exibir o formulário e processar as informações submetidas pelos usuários. O controller deve criar uma instância da classe de formulário e renderizar o template do formulário.
namespace AppBundleController;
use AppBundleEntityTask;
use AppBundleFormTaskType;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationRequest;
class TaskController extends Controller
{
public function createAction(Request $request)
{
$task = new Task();
$form = $this->createForm(TaskType::class, $task);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($task);
$em->flush();
return $this->redirectToRoute('task_list');
}
return $this->render('task/create.html.twig', [
'form' => $form->createView(),
]);
}
}
Por fim, precisamos criar o template do formulário, que irá exibir os campos definidos na classe de formulário.
{% extends 'base.html.twig' %}
{% block body %}
Create Task
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
{% endblock %}
Atribuição de Tarefas a Usuários:
Para atribuir tarefas a um usuário específico, precisamos criar uma relação entre as entidades de Tarefa e Usuário. Vamos criar um relacionamento de muitos para um, onde várias tarefas podem pertencer a um usuário.
Para criar este relacionamento, precisamos adicionar um campo de relacionamento na entidade Task e alterar a classe TaskType para incluir este campo no formulário. Em seguida, precisamos atualizar o controller create para atribuir a tarefa ao usuário selecionado e atualizar o template para exibir o campo necessário.
namespace AppBundleEntity;
use DoctrineORMMapping as ORM;
use SymfonyComponentValidatorConstraints as Assert;
/**
* @ORMEntity()
*/
class Task
{
// ...
/**
* @ORMManyToOne(targetEntity="User")
* @ORMJoinColumn(nullable=false)
* @AssertNotBlank()
*/
private $assignedTo;
// ...
public function getAssignedTo()
{
return $this->assignedTo;
}
public function setAssignedTo(User $assignedTo)
{
$this->assignedTo = $assignedTo;
return $this;
}
}
namespace AppBundleForm;
use AppBundleEntityTask;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormExtensionCoreTypeChoiceType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
class TaskType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('title')
->add('description')
->add('dueDate', null, ['widget' => 'single_text'])
->add('assignedTo', ChoiceType::class, [
'choices' => $options['users'],
])
->add('save', 'submit');
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Task::class,
'users' => [],
));
}
}
namespace AppBundleController;
use AppBundleEntityTask;
use AppBundleFormTaskType;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationRequest;
class TaskController extends Controller
{
public function createAction(Request $request)
{
$task = new Task();
$form = $this->createForm(TaskType::class, $task, [
'users' => $this->getDoctrine()->getRepository('AppBundle:User')->findAll(),
]);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($task);
$em->flush();
return $this->redirectToRoute('task_list');
}
return $this->render('task/create.html.twig', [
'form' => $form->createView(),
]);
}
}
{% extends 'base.html.twig' %}
{% block body %}
Create Task
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
{% endblock %}
Gerenciando o Status das Tarefas:
Por fim, precisamos adicionar um campo ao formulário que permita que os usuários atualizem o status da tarefa. Criaremos um campo de escolha que permita que os usuários alterem o status entre “novo”, “em andamento” e “concluído”.
Para adicionar o campo de status, precisamos atualizar a entidade Task com o novo campo e a classe TaskType com o novo campo. Em seguida, precisamos atualizar o controller create para processar o novo campo e atualizar o template para exibir o campo necessário.
namespace AppBundleEntity;
use DoctrineORMMapping as ORM;
use SymfonyComponentValidatorConstraints as Assert;
/**
* @ORMEntity()
*/
class Task
{
// ...
/**
* @ORMColumn(type="string", length=20)
* @AssertNotBlank()
* @AssertChoice(choices = {"new", "in progress", "completed"})
*/
private $status = 'new';
// ...
public function getStatus()
{
return $this->status;
}
public function setStatus($status)
{
$this->status = $status;
return $this;
}
}
namespace AppBundleForm;
use AppBundleEntityTask;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormExtensionCoreTypeChoiceType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
class TaskType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('title')
->add('description')
->add('dueDate', null, ['widget' => 'single_text'])
->add('status', ChoiceType::class, [
'choices' => [
'New' => 'new',
'In Progress' => 'in progress',
'Completed' => 'completed',
],
])
->add('assignedTo', ChoiceType::class, [
'choices' => $options['users'],
])
->add('save', 'submit');
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Task::class,
'users' => [],
));
}
}
{% extends 'base.html.twig' %}
{% block body %}
Create Task
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
{% endblock %}
Conclusão:
Neste tutorial, aprendemos a criar um sistema simples de gerenciamento de tarefas com Symfony. Vimos como criar um banco de dados utilizado o Doctrine, como criar entidades para representar as tarefas e usuários, como criar um formulário para a criação de tarefas e como atribuir tarefas a usuários. Também aprendemos como permitir que os usuários gerenciem o status das tarefas.
Esperamos que este tutorial tenha sido útil e que você tenha aprendido algo novo sobre o Symfony. Fique à vontade para experimentar com o código-fonte e personalizar o sistema de acordo com as suas necessidades!