Introdução ao Laravel: estrutura e filosofia

1. O que é o Laravel e sua filosofia central

1.1. História e propósito do framework

Criado por Taylor Otwell em 2011, o Laravel surgiu como uma alternativa mais expressiva e elegante ao CodeIgniter, que na época era o framework PHP mais popular. O objetivo principal era oferecer uma ferramenta que tornasse tarefas comuns como autenticação, roteamento e cache muito mais simples e intuitivas. Hoje, o Laravel é o framework PHP mais utilizado no mundo, com uma comunidade ativa e um ecossistema robusto.

1.2. Princípios fundamentais: convenção sobre configuração e elegância

Dois pilares sustentam a filosofia do Laravel: convenção sobre configuração e código expressivo. No primeiro, o framework assume decisões sensatas por padrão, reduzindo a quantidade de configurações necessárias para iniciar um projeto. No segundo, a sintaxe é pensada para ser limpa e legível, aproximando o código da linguagem natural.

// Exemplo de código expressivo no Laravel
$user = User::where('active', true)
            ->orderBy('name')
            ->first();

1.3. Ecossistema Laravel: Forge, Vapor, Nova e outros componentes

O Laravel não é apenas um framework, mas um ecossistema completo:

  • Laravel Forge: gerenciamento de servidores e deploy automatizado
  • Laravel Vapor: plataforma serverless para deploy em AWS Lambda
  • Laravel Nova: painel administrativo elegante e poderoso
  • Laravel Horizon: monitoramento de filas com interface visual
  • Laravel Telescope: debug e monitoramento de requisições

2. Estrutura de diretórios e organização do projeto

2.1. Raiz do projeto

Ao criar um novo projeto Laravel, você encontra a seguinte estrutura:

meu-projeto/
├── app/           # Código principal da aplicação
├── bootstrap/     # Arquivos de inicialização do framework
├── config/        # Arquivos de configuração
├── database/      # Migrations, seeders e factories
├── public/        # Ponto de entrada pública (index.php)
├── resources/     # Views Blade, assets não compilados
├── routes/        # Definição de rotas da aplicação
├── storage/       # Logs, cache, arquivos de sessão
└── tests/         # Testes automatizados

2.2. O padrão MVC no Laravel

O Laravel segue o padrão Model-View-Controller de forma natural:

  • Models (app/Models/): representam dados e lógica de negócio
  • Views (resources/views/): templates Blade para apresentação
  • Controllers (app/Http/Controllers/): intermediários entre models e views
// Exemplo de Controller
namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function index()
    {
        $users = User::all();
        return view('users.index', compact('users'));
    }
}

2.3. Arquivos de configuração e o ambiente .env

O arquivo .env armazena configurações sensíveis como credenciais de banco de dados e chaves de API. Já os arquivos em config/ contêm configurações públicas que podem ser acessadas via helper config().

// Acessando configurações
$database = config('database.default');
$appName = env('APP_NAME', 'Laravel');

3. O ciclo de vida de uma requisição HTTP

3.1. Entrada pública: o arquivo index.php

Toda requisição passa pelo public/index.php, que carrega o autoload do Composer e inicializa o framework:

// public/index.php (simplificado)
require __DIR__.'/../vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);
$response->send();
$kernel->terminate($request, $response);

3.2. Kernel HTTP e a pilha de middlewares

O Kernel HTTP gerencia a pilha de middlewares global e de grupos. Middlewares executam ações antes e depois da requisição ser processada pelo controller.

// Exemplo de middleware personalizado
namespace App\Http\Middleware;

use Closure;

class EnsureUserIsActive
{
    public function handle($request, Closure $next)
    {
        if (! $request->user()->is_active) {
            return redirect('login');
        }
        return $next($request);
    }
}

3.3. Roteamento, controllers e resposta final

O roteador encaminha a requisição para o controller apropriado, que processa a lógica e retorna uma resposta (view, JSON, redirect, etc).

4. Roteamento: a porta de entrada da aplicação

4.1. Rotas básicas e parâmetros

As rotas são definidas no arquivo routes/web.php (para interface web) ou routes/api.php (para APIs).

// Rotas básicas
Route::get('/hello', function () {
    return 'Hello World';
});

Route::post('/users', [UserController::class, 'store']);

// Parâmetros de rota
Route::get('/user/{id}', function ($id) {
    return "Usuário {$id}";
});

// Parâmetros opcionais
Route::get('/search/{query?}', function ($query = null) {
    return $query ?? 'Nenhum termo de busca';
});

4.2. Grupos de rotas, prefixos e namespaces

Route::prefix('admin')->group(function () {
    Route::get('/dashboard', [AdminController::class, 'dashboard']);
    Route::get('/users', [AdminController::class, 'users']);
});

Route::middleware(['auth'])->group(function () {
    Route::get('/profile', [ProfileController::class, 'show']);
    Route::post('/profile', [ProfileController::class, 'update']);
});

4.3. Rotas nomeadas e redirecionamentos

Route::get('/profile', [ProfileController::class, 'show'])->name('profile.show');

// Gerando URL a partir do nome da rota
$url = route('profile.show');

// Redirecionamento
return redirect()->route('profile.show');

5. Controllers e a camada de apresentação

5.1. Controllers básicos e Resource Controllers

Controllers organizam a lógica de requisições HTTP. Resource Controllers fornecem métodos pré-definidos para operações CRUD.

// Gerando um Resource Controller
// php artisan make:controller PostController --resource

class PostController extends Controller
{
    public function index() { /* Listar posts */ }
    public function create() { /* Formulário de criação */ }
    public function store(Request $request) { /* Salvar novo post */ }
    public function show($id) { /* Exibir post específico */ }
    public function edit($id) { /* Formulário de edição */ }
    public function update(Request $request, $id) { /* Atualizar post */ }
    public function destroy($id) { /* Excluir post */ }
}

// Registrando Resource Controller
Route::resource('posts', PostController::class);

5.2. Injeção de dependência em controllers

O Laravel resolve automaticamente as dependências dos controllers através do Service Container:

use App\Services\PaymentGateway;

class OrderController extends Controller
{
    protected $paymentGateway;

    public function __construct(PaymentGateway $paymentGateway)
    {
        $this->paymentGateway = $paymentGateway;
    }

    public function process(Order $order)
    {
        $this->paymentGateway->charge($order);
    }
}

5.3. Views Blade: templates, layouts e componentes

Blade é o motor de templates do Laravel, permitindo herança de layouts e componentes reutilizáveis:

{{-- resources/views/layouts/app.blade.php --}}
<html>
<head>
    <title>@yield('title')</title>
</head>
<body>
    <div class="container">
        @yield('content')
    </div>
</body>
</html>

{{-- resources/views/posts/index.blade.php --}}
@extends('layouts.app')

@section('title', 'Lista de Posts')

@section('content')
    @foreach($posts as $post)
        <div class="post">
            <h2>{{ $post->title }}</h2>
            <p>{{ $post->excerpt }}</p>
        </div>
    @endforeach
@endsection

6. Models, Eloquent ORM e bancos de dados

6.1. Migrations: versionamento de esquema do banco

Migrations permitem versionar e compartilhar alterações no banco de dados:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePostsTable extends Migration
{
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained();
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

6.2. Eloquent ORM: definição de models e consultas básicas

Eloquent é o ORM ativo do Laravel, proporcionando uma sintaxe elegante para interagir com o banco:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = ['title', 'body', 'user_id'];

    // Consultas básicas
    $posts = Post::where('user_id', 1)->get();
    $post = Post::find(1);
    $activePosts = Post::where('published', true)->orderBy('created_at', 'desc')->get();

    // Inserção
    Post::create(['title' => 'Novo Post', 'body' => 'Conteúdo...']);
}

6.3. Relacionamentos e convenções de nomenclatura

Eloquent suporta todos os tipos de relacionamentos de banco de dados:

class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

class Post extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }

    public function tags()
    {
        return $this->belongsToMany(Tag::class);
    }
}

// Uso dos relacionamentos
$user = User::find(1);
$posts = $user->posts; // Coleção de posts do usuário

$post = Post::find(1);
$author = $post->user; // Usuário autor do post

7. Service Container e Service Providers

7.1. O Service Container: ligação e resolução de classes

O Service Container gerencia dependências e permite injeção automática:

// Ligação de interface a implementação
$this->app->bind(PaymentInterface::class, StripePayment::class);

// Resolução automática
$payment = app(PaymentInterface::class);

7.2. Service Providers: onde registrar bindings e eventos

Service Providers são o ponto central para configurar serviços no Laravel:

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton(CurrencyConverter::class, function ($app) {
            return new CurrencyConverter(config('services.currency.api_key'));
        });
    }

    public function boot()
    {
        // Configurações executadas após todos providers serem registrados
    }
}

7.3. Facades: acesso estático a serviços do container

Facades fornecem uma interface estática para classes do container:

use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;

// Exemplo de uso de Facades
Cache::put('key', 'value', 600);
$users = DB::table('users')->get();

8. Artisan CLI e produtividade no desenvolvimento

8.1. Comandos essenciais

Artisan é a interface de linha de comando do Laravel, oferecendo dezenas de comandos úteis:

# Comandos essenciais
php artisan make:controller UserController
php artisan make:model Post -m  # Cria model com migration
php artisan migrate
php artisan route:list
php artisan tinker  # REPL interativo
php artisan cache:clear

8.2. Geração automática de código e scaffolding

O Artisan pode gerar classes completas com poucos comandos:

# Geração de código
php artisan make:model Product --all  # Model, migration, controller, factory, seeder
php artisan make:mail OrderShipped    # Classe de e-mail
php artisan make:event UserRegistered # Classe de evento
php artisan make:job ProcessVideo     # Job para filas

8.3. Customização de comandos Artisan

Você pode criar comandos personalizados para automatizar tarefas específicas:

namespace App\Console\Commands;

use Illuminate\Console\Command;

class GenerateSitemap extends Command
{
    protected $signature = 'sitemap:generate {--force}';
    protected $description = 'Gera o sitemap do site';

    public function handle()
    {
        $this->info('Gerando sitemap...');
        // Lógica de geração
        $this->info('Sitemap gerado com sucesso!');
    }
}

O Laravel representa uma evolução significativa na forma como desenvolvemos aplicações PHP, combinando elegância de código com produtividade. Sua filosofia centrada no desenvolvedor, aliada a um ecossistema maduro, torna o framework a escolha ideal tanto para iniciantes quanto para projetos enterprise complexos.

Referências

  • Documentação oficial do Laravel — Documentação completa do framework, incluindo guias de instalação, estrutura, roteamento, Eloquent e Artisan.
  • Laravel: The PHP Framework for Web Artisans — Site oficial com overview do ecossistema, tutoriais e recursos para iniciantes.
  • Laravel News — Portal com notícias, tutoriais e artigos técnicos sobre o ecossistema Laravel.
  • Laracasts: Laravel From Scratch — Série de vídeo-tutoriais gratuitos cobrindo fundamentos do Laravel para iniciantes.
  • Laravel Daily — Blog com tutoriais práticos, dicas e exemplos de código para desenvolvimento com Laravel.
  • GitHub do Laravel — Repositório oficial do framework, onde você pode explorar o código-fonte e contribuir.
  • Laravel Bootcamp — Tutorial interativo oficial que ensina a construir uma aplicação completa com Laravel do zero.