Laravel Rehberi
Laravel'e hızlı bir giriş yapmak için önemli konulara dair rehber

Laravel 12: Başlangıç Seviyesi Pratik Rehber
İçindekiler
- Laravel Nedir?
- Kurulum
- İlk Projeniz
- Routes (Yönlendirme)
- Controllers (Kontrolörler)
- Views (Görünümler)
- Database (Veritabanı)
- Models (Modeller)
- CRUD İşlemleri
- Form İşlemleri
- Kimlik Doğrulama
Laravel Nedir?
Laravel, PHP ile web uygulamaları geliştirmek için kullanılan modern ve kullanıcı dostu bir framework’tür. Temiz kod yazmanızı sağlar ve birçok hazır özellik sunar.
Neden Laravel?
- Kolay Öğrenilir: Anlaşılır dokümantasyon ve topluluk desteği
- Hızlı Geliştirme: Hazır araçlar ve yapılar
- Güvenli: Built-in güvenlik özellikleri
- Modern: Güncel PHP standartları
Kurulum
Gereksinimler
- PHP 8.2 veya üzeri
- Composer (PHP paket yöneticisi)
Composer Kurulumu
Windows, Mac veya Linux için getcomposer.org adresinden indirin.
Laravel Projesi Oluşturma
# Yöntem 1: Laravel Installer ile (önerilen)
composer global require laravel/installer
laravel new blog
# Yöntem 2: Composer ile direkt
composer create-project laravel/laravel blog
# Proje klasörüne girin
cd blog
# Geliştirme sunucusunu başlatın
php artisan serve
Tarayıcınızda http://localhost:8000 adresini açın. Laravel hoş geldin sayfasını göreceksiniz!
İlk Projeniz
Proje Yapısı
blog/
├── app/ # Uygulama kodu
│ ├── Http/
│ │ └── Controllers/ # Controller'lar
│ └── Models/ # Veritabanı modelleri
├── config/ # Konfigürasyon dosyaları
├── database/ # Veritabanı işlemleri
├── public/ # Halka açık dosyalar (index.php)
├── resources/ # Views, CSS, JS
│ └── views/ # Blade şablonları
├── routes/ # Route tanımları
│ └── web.php # Web route'ları
└── .env # Ortam değişkenleri
.env Dosyası Ayarları
APP_NAME=Blog
APP_URL=http://localhost
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=blog
DB_USERNAME=root
DB_PASSWORD=
Veritabanı Oluşturma
MySQL’de yeni bir veritabanı oluşturun:
CREATE DATABASE blog;
Routes (Yönlendirme)
Route’lar, URL’leri uygulama kodunuza bağlar. routes/web.php dosyasında tanımlanır.
Basit Route Örnekleri
<?php
// routes/web.php
use Illuminate\Support\Facades\Route;
// Ana sayfa
Route::get('/', function () {
return view('welcome');
});
// Hakkımda sayfası
Route::get('/hakkimda', function () {
return 'Hakkımda sayfası';
});
// Parametreli route
Route::get('/merhaba/{isim}', function ($isim) {
return "Merhaba, $isim!";
});
// Opsiyonel parametre
Route::get('/kullanici/{isim?}', function ($isim = 'Misafir') {
return "Hoş geldin, $isim!";
});
Route İsimlendirme
Route::get('/iletisim', function () {
return view('iletisim');
})->name('iletisim');
// Başka bir yerde kullanımı
$url = route('iletisim'); // /iletisim
Controllers (Kontrolörler)
Controller’lar, route mantığını organize etmenizi sağlar.
Controller Oluşturma
php artisan make:controller PostController
Basit Controller Örneği
<?php
// app/Http/Controllers/PostController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PostController extends Controller
{
// Tüm gönderileri listele
public function index()
{
return view('posts.index');
}
// Tek gönderi göster
public function show($id)
{
return view('posts.show', ['id' => $id]);
}
// Yeni gönderi formu
public function create()
{
return view('posts.create');
}
}
Route’larda Controller Kullanımı
<?php
// routes/web.php
use App\Http\Controllers\PostController;
Route::get('/posts', [PostController::class, 'index']);
Route::get('/posts/{id}', [PostController::class, 'show']);
Route::get('/posts/create', [PostController::class, 'create']);
Resource Controller (Hepsi Bir Arada)
php artisan make:controller PostController --resource
// Tek satırda tüm CRUD route'ları
Route::resource('posts', PostController::class);
// Bu şu route'ları oluşturur:
// GET /posts - index (liste)
// GET /posts/create - create (form)
// POST /posts - store (kaydet)
// GET /posts/{id} - show (göster)
// GET /posts/{id}/edit - edit (düzenle formu)
// PUT /posts/{id} - update (güncelle)
// DELETE /posts/{id} - destroy (sil)
Views (Görünümler)
View’lar, kullanıcıya gösterilen HTML sayfalarıdır. resources/views klasöründe .blade.php uzantısıyla kaydedilir.
Basit View Oluşturma
resources/views/merhaba.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Merhaba</title>
</head>
<body>
<h1>Merhaba, Laravel!</h1>
</body>
</html>
// Route'da kullanımı
Route::get('/merhaba', function () {
return view('merhaba');
});
View’a Veri Gönderme
// Controller'da
public function show()
{
$baslik = 'Laravel Öğreniyorum';
$yazar = 'Ahmet Yılmaz';
return view('post', [
'baslik' => $baslik,
'yazar' => $yazar
]);
// Veya compact kullanarak
return view('post', compact('baslik', 'yazar'));
}
resources/views/post.blade.php
<!DOCTYPE html>
<html>
<head>
<title>{{ $baslik }}</title>
</head>
<body>
<h1>{{ $baslik }}</h1>
<p>Yazar: {{ $yazar }}</p>
</body>
</html>
Blade Template Engine Temelleri
{{-- Değişken yazdırma --}}
<h1>{{ $baslik }}</h1>
{{-- If-Else --}}
@if($sayi > 10)
<p>Sayı 10'dan büyük</p>
@else
<p>Sayı 10'dan küçük veya eşit</p>
@endif
{{-- Döngü --}}
@foreach($posts as $post)
<article>
<h2>{{ $post->title }}</h2>
<p>{{ $post->content }}</p>
</article>
@endforeach
{{-- Boş kontrol --}}
@forelse($posts as $post)
<p>{{ $post->title }}</p>
@empty
<p>Gönderi bulunamadı.</p>
@endforelse
Layout Kullanımı
{{-- resources/views/layouts/app.blade.php --}}
<!DOCTYPE html>
<html>
<head>
<title>@yield('title', 'Blog')</title>
<link rel="stylesheet" href="/css/app.css">
</head>
<body>
<nav>
<a href="/">Ana Sayfa</a>
<a href="/posts">Gönderiler</a>
<a href="/iletisim">İletişim</a>
</nav>
<main>
@yield('content')
</main>
<footer>
<p>© 2025 Blog</p>
</footer>
</body>
</html>
{{-- resources/views/posts/index.blade.php --}}
@extends('layouts.app')
@section('title', 'Tüm Gönderiler')
@section('content')
<h1>Blog Gönderileri</h1>
@foreach($posts as $post)
<article>
<h2>{{ $post->title }}</h2>
<p>{{ $post->content }}</p>
</article>
@endforeach
@endsection
Database (Veritabanı)
Migration (Tablo Oluşturma)
# posts tablosu için migration oluştur
php artisan make:migration create_posts_table
<?php
// database/migrations/2025_xx_xx_create_posts_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id(); // otomatik artan ID
$table->string('title'); // başlık
$table->text('content'); // içerik
$table->boolean('published')->default(false); // yayında mı?
$table->timestamps(); // created_at ve updated_at
});
}
public function down()
{
Schema::dropIfExists('posts');
}
};
# Migration'ı çalıştır (tabloyu oluştur)
php artisan migrate
Kolon Tipleri
$table->id(); // Auto-increment ID
$table->string('name'); // VARCHAR
$table->string('name', 100); // VARCHAR(100)
$table->text('description'); // TEXT
$table->integer('age'); // INTEGER
$table->boolean('active'); // BOOLEAN
$table->date('birth_date'); // DATE
$table->timestamps(); // created_at, updated_at
Models (Modeller)
Model, veritabanı tablonuzu temsil eden PHP sınıfıdır.
Model Oluşturma
# Basit model
php artisan make:model Post
# Migration ile birlikte
php artisan make:model Post -m
Basit Model Örneği
<?php
// app/Models/Post.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
// Tabloda hangi alanlar doldurulabilir
protected $fillable = ['title', 'content', 'published'];
// Veya hangilerinin doldurulması engellenmeli
// protected $guarded = ['id'];
}
Model ile Veritabanı İşlemleri
use App\Models\Post;
// Yeni kayıt ekleme
$post = new Post();
$post->title = 'İlk Gönderim';
$post->content = 'Bu benim ilk blog gönderim.';
$post->save();
// Veya
$post = Post::create([
'title' => 'İkinci Gönderim',
'content' => 'Bu da ikinci gönderim.',
'published' => true
]);
// Tüm kayıtları getirme
$posts = Post::all();
// Tek kayıt bulma
$post = Post::find(1); // ID'ye göre
$post = Post::where('published', true)->first();
// Güncelleme
$post = Post::find(1);
$post->title = 'Güncellenmiş Başlık';
$post->save();
// Silme
$post = Post::find(1);
$post->delete();
CRUD İşlemleri
Bir blog sistemi için eksiksiz CRUD örneği.
Controller
<?php
// app/Http/Controllers/PostController.php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
// Tüm gönderileri listele
public function index()
{
$posts = Post::latest()->get(); // En yeniden eskiye
return view('posts.index', compact('posts'));
}
// Yeni gönderi formu
public function create()
{
return view('posts.create');
}
// Yeni gönderiyi kaydet
public function store(Request $request)
{
// Doğrulama
$request->validate([
'title' => 'required|max:255',
'content' => 'required|min:10'
]);
// Kaydet
Post::create($request->all());
// Yönlendir
return redirect()->route('posts.index')
->with('success', 'Gönderi başarıyla oluşturuldu!');
}
// Tek gönderiyi göster
public function show(Post $post)
{
return view('posts.show', compact('post'));
}
// Düzenleme formu
public function edit(Post $post)
{
return view('posts.edit', compact('post'));
}
// Güncelleme
public function update(Request $request, Post $post)
{
$request->validate([
'title' => 'required|max:255',
'content' => 'required|min:10'
]);
$post->update($request->all());
return redirect()->route('posts.show', $post)
->with('success', 'Gönderi güncellendi!');
}
// Silme
public function destroy(Post $post)
{
$post->delete();
return redirect()->route('posts.index')
->with('success', 'Gönderi silindi!');
}
}
Routes
<?php
// routes/web.php
use App\Http\Controllers\PostController;
Route::resource('posts', PostController::class);
Views
{{-- resources/views/posts/index.blade.php --}}
@extends('layouts.app')
@section('content')
<h1>Tüm Gönderiler</h1>
<a href="{{ route('posts.create') }}">Yeni Gönderi</a>
@if(session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
@foreach($posts as $post)
<article>
<h2>{{ $post->title }}</h2>
<p>{{ Str::limit($post->content, 100) }}</p>
<a href="{{ route('posts.show', $post) }}">Oku</a>
<a href="{{ route('posts.edit', $post) }}">Düzenle</a>
</article>
@endforeach
@endsection
{{-- resources/views/posts/create.blade.php --}}
@extends('layouts.app')
@section('content')
<h1>Yeni Gönderi</h1>
@if($errors->any())
<div class="alert alert-danger">
<ul>
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('posts.store') }}" method="POST">
@csrf
<div>
<label>Başlık:</label>
<input type="text" name="title" value="{{ old('title') }}" required>
</div>
<div>
<label>İçerik:</label>
<textarea name="content" required>{{ old('content') }}</textarea>
</div>
<div>
<label>
<input type="checkbox" name="published" value="1">
Yayınla
</label>
</div>
<button type="submit">Kaydet</button>
</form>
@endsection
{{-- resources/views/posts/edit.blade.php --}}
@extends('layouts.app')
@section('content')
<h1>Gönderiyi Düzenle</h1>
<form action="{{ route('posts.update', $post) }}" method="POST">
@csrf
@method('PUT')
<div>
<label>Başlık:</label>
<input type="text" name="title" value="{{ old('title', $post->title) }}" required>
</div>
<div>
<label>İçerik:</label>
<textarea name="content" required>{{ old('content', $post->content) }}</textarea>
</div>
<div>
<label>
<input type="checkbox" name="published" value="1"
{{ $post->published ? 'checked' : '' }}>
Yayınla
</label>
</div>
<button type="submit">Güncelle</button>
</form>
<form action="{{ route('posts.destroy', $post) }}" method="POST"
onsubmit="return confirm('Emin misiniz?')">
@csrf
@method('DELETE')
<button type="submit">Sil</button>
</form>
@endsection
Form İşlemleri
CSRF Koruması
Laravel, tüm POST formlarında CSRF token gerektirir:
<form method="POST" action="/kaydet">
@csrf
<!-- form alanları -->
</form>
Method Spoofing
HTML formları sadece GET ve POST destekler. PUT, PATCH, DELETE için:
<form method="POST" action="/posts/1">
@csrf
@method('PUT')
<!-- form alanları -->
</form>
Validation (Doğrulama)
// Controller'da
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|max:255',
'email' => 'required|email|unique:users',
'age' => 'required|integer|min:18',
'content' => 'required|min:10'
]);
// $validated verisi temizdir, kullanılabilir
}
Türkçe Hata Mesajları
$request->validate([
'title' => 'required|max:255',
], [
'title.required' => 'Başlık alanı zorunludur.',
'title.max' => 'Başlık en fazla 255 karakter olabilir.'
]);
Eski Değerleri Koruma
<input type="text" name="title" value="{{ old('title') }}">
Hataları Gösterme
@error('title')
<div class="error">{{ $message }}</div>
@enderror
Kimlik Doğrulama
Laravel, kullanıcı kayıt ve giriş sistemi için hazır çözümler sunar.
Laravel Breeze (Basit ve Hızlı)
# Breeze'i yükle
composer require laravel/breeze --dev
# Kurulum (Blade + Tailwind)
php artisan breeze:install blade
# Asset'leri derle
npm install
npm run dev
# Veritabanını hazırla
php artisan migrate
Bu komutlar otomatik olarak şunları ekler:
- Kayıt sayfası
- Giriş sayfası
- Şifre sıfırlama
- Email doğrulama
- Profil sayfası
Kullanıcı Kontrolü
// Controller'da
use Illuminate\Support\Facades\Auth;
// Giriş yapmış mı?
if (Auth::check()) {
// Kullanıcı giriş yapmış
}
// Mevcut kullanıcıyı al
$user = Auth::user();
$userId = Auth::id();
// Blade'de
@auth
<p>Hoş geldin, {{ Auth::user()->name }}</p>
@endauth
@guest
<a href="/login">Giriş Yap</a>
@endguest
Route Koruma
// Sadece giriş yapmış kullanıcılar
Route::middleware('auth')->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index']);
Route::resource('posts', PostController::class);
});
// Sadece misafirler
Route::middleware('guest')->group(function () {
Route::get('/login', [LoginController::class, 'show']);
Route::get('/register', [RegisterController::class, 'show']);
});
Controller’da Auth Kullanımı
public function store(Request $request)
{
// Mevcut kullanıcının ID'si
$userId = auth()->id();
Post::create([
'title' => $request->title,
'content' => $request->content,
'user_id' => $userId
]);
}
// Veya
public function store(Request $request)
{
$request->user()->posts()->create([
'title' => $request->title,
'content' => $request->content,
]);
}
Pratik İpuçları
Artisan Komutları
# Route'ları listele
php artisan route:list
# Cache temizle
php artisan cache:clear
php artisan config:clear
php artisan view:clear
# Yardım
php artisan help migrate
php artisan list
Debugging
// Değişkeni dump et ve devam et
dump($degisken);
// Dump et ve dur
dd($degisken);
// Birden fazla değişken
dd($var1, $var2, $var3);
.env Değişkenlerini Kullanma
// .env dosyasında
APP_NAME="Blog Sitem"
ADMIN_EMAIL=admin@example.com
// Kod içinde
$appName = env('APP_NAME');
$adminEmail = env('ADMIN_EMAIL', 'varsayilan@ornek.com');
String Helper’ları
use Illuminate\Support\Str;
// İçeriği kısalt
Str::limit($text, 100);
// Slug oluştur
Str::slug('Laravel Öğreniyorum'); // laravel-ogreniyorum
// Rastgele string
Str::random(10);
// Büyük/küçük harf
Str::upper($text);
Str::lower($text);
Str::title($text);
Sonuç
Bu rehber size Laravel’in temellerini öğretmek için hazırlamaya çalıştım. Öğrendiklerinizi pekiştirmek için kendi blog projenizi geliştirmeye çalışın:
- Laravel kurulumu yapın
- Veritabanı bağlantısını ayarlayın
- Post modeli ve migration’ı oluşturun
- CRUD işlemlerini tamamlayın
- Authentication ekleyin
- Kendi özelliklerinizi geliştirin
Daha Fazla Öğrenmek İçin
Python tarafındaki karşılıklar için Django rehberi ve Flask rehberi var. Önbellek ve kuyruk için Redis ile RabbitMQ ve Kafka notlarına bakabilirsin.
etiketler
php laravel web api rest backend mvcE-posta Bültenine Abone Olun
Yeni paylaşımlardan ve notlardan anında haberdar olmak için bültene katılın.