Desenvolvendo uma Aplicação Completa com Laravel: Um Estudo de Caso

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