Desenvolvendo uma Aplicação Completa com Laravel: Um Estudo de Caso
Hoje, quero compartilhar com vocês um estudo de caso de um projeto que desenvolvi utilizando o framework Laravel. Vou detalhar os desafios que encontrei, as soluções que implementei e os resultados que obtive. Espero que isso possa inspirar e ajudar você em seus próprios projetos!
Visão Geral do Projeto
O projeto consistia em criar uma aplicação web de gerenciamento de tarefas para uma pequena empresa. A aplicação precisava permitir que os usuários criassem, editassem e excluíssem tarefas, além de atribuir prioridades e datas de vencimento.
Estrutura do Projeto
1. Configuração do Ambiente
2. Criação do Banco de Dados e Migrações
3. Modelos e Relações
4. Rotas e Controladores
5. Views com Blade
6. Autenticação e Autorização
7. Testes e Depuração
1. Configuração do Ambiente
O primeiro passo foi configurar o ambiente de desenvolvimento. Utilizei o Laravel Homestead para garantir um ambiente consistente.
vagrant box add laravel/homestead
git clone https://github.com/laravel/homestead.git Homestead
cd Homestead
bash init.sh
Depois, configurei o arquivo `Homestead.yaml` para definir o caminho para o meu projeto e o nome do banco de dados.
2. Criação do Banco de Dados e Migrações
Em seguida, criei a estrutura do banco de dados utilizando migrações. Para este projeto, precisei de tabelas para usuários e tarefas.
php artisan make:migration create_tasks_table
No arquivo de migração, defini as colunas necessárias:
Schema::create('tasks', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('description')->nullable();
$table->enum('priority', ['low', 'medium', 'high']);
$table->date('due_date');
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->timestamps();
});
3. Modelos e Relações
Criei os modelos para as tabelas `User` e `Task`, estabelecendo as relações entre eles.
class User extends Authenticatable
{
public function tasks()
{
return $this->hasMany(Task::class);
}
}
class Task extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
4. Rotas e Controladores
Defini as rotas necessárias no arquivo `web.php` e criei controladores para lidar com as requisições.
Route::resource('tasks', TaskController::class);
TaskController.php
class TaskController extends Controller
{
public function index()
{
$tasks = auth()->user()->tasks;
return view('tasks.index', compact('tasks'));
}
public function create()
{
return view('tasks.create');
}
public function store(Request $request)
{
$request->validate([
'title' => 'required',
'priority' => 'required',
'due_date' => 'required|date',
]);
auth()->user()->tasks()->create($request->all());
return redirect()->route('tasks.index');
}
public function show(Task $task)
{
$this->authorize('view', $task);
return view('tasks.show', compact('task'));
}
public function edit(Task $task)
{
$this->authorize('update', $task);
return view('tasks.edit', compact('task'));
}
public function update(Request $request, Task $task)
{
$this->authorize('update', $task);
$request->validate([
'title' => 'required',
'priority' => 'required',
'due_date' => 'required|date',
]);
$task->update($request->all());
return redirect()->route('tasks.index');
}
public function destroy(Task $task)
{
$this->authorize('delete', $task);
$task->delete();
return redirect()->route('tasks.index');
}
}
5. Views com Blade
Utilizei o Blade para criar as views. Aqui está um exemplo da view `tasks/index.blade.php`:
@extends('layouts.app')
@section('content')
<div class="container">
<h1>Lista de Tarefas</h1>
<a href="{{ route('tasks.create') }}" class="btn btn-primary">Nova Tarefa</a>
<table class="table mt-4">
<thead>
<tr>
<th>Título</th>
<th>Prioridade</th>
<th>Data de Vencimento</th>
<th>Ações</th>
</tr>
</thead>
<tbody>
@foreach($tasks as $task)
<tr>
<td>{{ $task->title }}</td>
<td>{{ ucfirst($task->priority) }}</td>
<td>{{ $task->due_date->format('d/m/Y') }}</td>
<td>
<a href="{{ route('tasks.edit', $task) }}" class="btn btn-warning">Editar</a>
<form action="{{ route('tasks.destroy', $task) }}" method="POST" style="display:inline;">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger">Excluir</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@endsection
6. Autenticação e Autorização
Utilizei o pacote `laravel/ui` para implementar a autenticação básica.
Terminal:
composer require laravel/ui
php artisan ui vue --auth
npm install && npm run dev
Em seguida, defini políticas de autorização para garantir que os usuários só pudessem modificar suas próprias tarefas.
class TaskPolicy
{
public function view(User $user, Task $task)
{
return $user->id === $task->user_id;
}
public function update(User $user, Task $task)
{
return $user->id === $task->user_id;
}
public function delete(User $user, Task $task)
{
return $user->id === $task->user_id;
}
}
7. Testes e Depuração
Escrevi testes para garantir que todas as funcionalidades estavam funcionando corretamente.
public function test_user_can_create_task()
{
$user = User::factory()->create();
$this->actingAs($user);
$response = $this->post('/tasks', [
'title' => 'Nova Tarefa',
'priority' => 'high',
'due_date' => now()->addDays(5),
]);
$response->assertRedirect('/tasks');
$this->assertDatabaseHas('tasks', ['title' => 'Nova Tarefa']);
}
Este projeto foi uma ótima oportunidade para explorar as capacidades do Laravel e criar uma aplicação completa de gerenciamento de tarefas. Espero que este estudo de caso tenha sido útil e inspirador para você. Se tiver alguma dúvida ou sugestão, deixe um comentário abaixo!

Comentários
Enviar um comentário