Instalação e Configuração Inicial
A instalação do Laravel é simples graças ao Composer, gerenciador de dependências do PHP. Antes de começar, certifique-se de ter PHP 8.1+ e Composer instalados. Para criar um novo projeto, execute:
composer create-project laravel/laravel meu-projeto
cd meu-projeto
php artisan serve
O comando artisan serve inicia um servidor de desenvolvimento em http://localhost:8000. Para projetos existentes, rode composer install para restaurar dependências. Configure o arquivo .env com suas credenciais de banco de dados — este arquivo é crítico e nunca deve ser commitado no Git. Gere a chave de aplicação com php artisan key:generate se necessário.
Variáveis de Ambiente
O arquivo .env armazena configurações sensíveis. Crie uma cópia .env.example como referência. Altere DB_CONNECTION, DB_HOST, DB_DATABASE conforme seu ambiente:
APP_NAME="Meu App"
APP_ENV=local
APP_KEY=base64:sua_chave_aqui
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=root
DB_PASSWORD=
Estrutura de Pastas Explicada
A organização do Laravel segue padrões MVC (Model-View-Controller). Conheça as principais pastas: a pasta app/ contém a lógica central (Models, Controllers, Middleware); resources/ armazena views Blade e assets (CSS, JS); routes/ define as rotas da aplicação; database/ gerencia migrações e seeders; public/ é o ponto de acesso público; storage/ guarda logs e uploads; tests/ contém testes automatizados.
Pasta app/ - Coração da Aplicação
Aqui vivem os Models (representam tabelas do banco), Controllers (processam requisições), e lógica de negócio. Um exemplo típico:
// app/Models/Post.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $fillable = ['title', 'content', 'user_id'];
public function user()
{
return $this->belongsTo(User::class);
}
}
Pasta resources/views - Templates Blade
As views são templates HTML com a sintaxe Blade do Laravel. Blade permite lógica PHP limpa com @if, @foreach, @include:
<!-- resources/views/posts/index.blade.php -->
@extends('layouts.app')
@section('content')
<div class="container">
<h1>Posts</h1>
@foreach($posts as $post)
<article>
<h2>{{ $post->title }}</h2>
<p>{{ $post->content }}</p>
<small>Por {{ $post->user->name }}</small>
</article>
@endforeach
</div>
@endsection
Pasta routes/ - Definição de Endpoints
As rotas conectam URLs a controllers. O arquivo routes/web.php é para rotas web tradicionais:
// routes/web.php
use App\Http\Controllers\PostController;
Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::post('/posts', [PostController::class, 'store'])->name('posts.store');
Route::get('/posts/{id}', [PostController::class, 'show'])->name('posts.show');
Route::put('/posts/{id}', [PostController::class, 'update'])->name('posts.update');
Route::delete('/posts/{id}', [PostController::class, 'destroy'])->name('posts.destroy');
Primeiros Passos Práticos
Comece criando um Model com Controller e Migration integrados. O comando Artisan torna isso automático:
php artisan make:model Post -m -c
O flag -m cria a migração, -c cria o controller. Edite a migração em database/migrations/:
// database/migrations/2024_01_15_create_posts_table.php
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->timestamps();
});
Após definir a estrutura, execute php artisan migrate para criar as tabelas. Agora crie um Controller com CRUD completo:
// app/Http/Controllers/PostController.php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function index()
{
$posts = Post::with('user')->paginate(10);
return view('posts.index', compact('posts'));
}
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'content' => 'required|string',
]);
Post::create(array_merge($validated, ['user_id' => auth()->id()]));
return redirect()->route('posts.index')->with('success', 'Post criado!');
}
public function show(Post $post)
{
return view('posts.show', compact('post'));
}
public function update(Request $request, Post $post)
{
$post->update($request->validate([
'title' => 'string|max:255',
'content' => 'string',
]));
return redirect()->back()->with('success', 'Atualizado!');
}
public function destroy(Post $post)
{
$post->delete();
return redirect()->route('posts.index')->with('success', 'Deletado!');
}
}
Considerações Finais e Debugging
Use php artisan tinker para testar código interativamente no contexto do Laravel. Para debug, adicione dd($variavel) (dump and die) ou use Log::info(). O comando php artisan make:request gera classes de validação reutilizáveis, mantendo controllers limpos. Sempre use eager loading com with() em queries para evitar problemas N+1.
Conclusão
Você agora compreende a instalação do Laravel, a organização lógica de suas pastas (app/, resources/, routes/, database/) e criou seu primeiro CRUD funcional. Estes fundamentos — Models, Controllers, Views e Routes — são blocos construtores para qualquer aplicação Laravel. A chave é praticar: crie pequenos projetos, explore Artisan commands e leia a documentação oficial constantemente.