“Backend’den gelen verilere ihtiyaç duyan frontend uygulamanız var ama API henüz güvende değil mi? Bu yazıda, yalnızca kimlik doğrulaması yapılmış kullanıcıların erişebileceği Laravel ile bir API CRUD oluşturmayı öğreneceksiniz.”
Neden API CRUD için Sanctum Kullanmalıyız?
Neden API CRUD için Sanctum Kullanmalıyız?
- Veri daha güvenli, yalnızca giriş yapmış kullanıcıların erişimi var
- SPA, mobil uygulama ve modern uygulamalar için uygun
- Frontend ile entegrasyonu kolay (React, Vue, vb.)
Çalışma Durumu: Makale API’si (CRUD + Auth)
Çalışma Durumu: Makale API’si (CRUD + Auth)
Giriş yaptıktan sonra yalnızca yetkilendirilmiş kullanıcıların erişebileceği API CRUD makale oluşturacağız.
Adım 1: Laravel & Sanctum Projesi Kurulumu
Adım 1: Laravel & Sanctum Projesi Kurulumu
composer create-project --prefer-dist laravel/laravel belajar-api
cd belajar-api
composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
Sanctum middleware’ini app/Http/Kernel.php dosyasındaki api grubuna ekleyin:
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
Adım 2: Kullanıcı ve Makale Modeli Kurulumu (Sahiplik Verisi)
Adım 2: Kullanıcı ve Makale Modeli Kurulumu (Sahiplik Verisi)
Kullanıcı
Kullanıcı
Model User sınıfına HasApiTokens trait’ini ekleyin ve makalelerle ilişkiyi tanımlayın:
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
// ...
public function articles() {
return $this->hasMany(Article::class);
}
}
Makale
Makale
php artisan make:model Article -m
Migrasyonu düzenleyin:
public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->timestamps();
});
}
Migrasyonu çalıştırın:
php artisan migrate
Model Article.php içinde:
protected $fillable = ['title', 'content', 'user_id'];
public function user() {
return $this->belongsTo(User::class);
}
Adım 3: Auth Kontrolörü (Kayıt, Giriş, Çıkış)
Adım 3: Auth Kontrolörü (Kayıt, Giriş, Çıkış)
php artisan make:controller Api/AuthController
Kayıt, giriş ve çıkış için örnek fonksiyonlar:
public function register(Request $request) {
$validated = $request->validate([
'name' => 'required',
'email' => 'required|email|unique:users',
'password' => 'required|min:6',
]);
$user = User::create([
'name' => $validated['name'],
'email' => $validated['email'],
'password' => bcrypt($validated[]),
]);
$token = $user->createToken()->plainTextToken;
return response()->json([=> $user, => $token], 201);
}
public function login(Request $request) {
$credentials = $request->only(, );
if (!auth()->attempt($credentials)) {
return response()->json([ ], 401);
}
$user = auth()->user();
$user->tokens()->delete();
$token = $user->createToken()->plainTextToken;
return response()->json([=> $user, => $token]);
}
public function logout(Request $request) {
$request->user()->currentAccessToken()->delete();
return response()->json([ ]);
}
Adım 4: Makale Kontrolörü (CRUD)
Adım 4: Makale Kontrolörü (CRUD)
php artisan make:controller Api/ArticleController --resource
CRUD örnek fonksiyonları:
public function index() {
return Article::all();
}
public function store(Request $request) {
$validated = $request->validate([
=> ,
=> ,
]);
// Sahiplik: makale giriş yapmış kullanıcının olmalı
$article = $request->user()->articles()->create($validated);
return response()->json($article, );
}
public function show(Request $request, $id) {
$article = Article::findOrFail($id);
// Yetkilendirme: yalnızca sahibi erişebilir
if ($article->user_id !== $request->user()->id) {
abort(403, );
}
return $article;
}
public function update(Request $request, $id) {
$article = Article::findOrFail($id);
if ($article->user_id !== $request->user()->id) {
abort(, );
}
$validated = $request->validate([
=> ,
=> ,
]);
$article->update($validated);
return response()->json($article);
}
public function destroy(Request $request, $id) {
$article = Article::findOrFail($id);
if ($article->user_id !== $request->user()->id) {
abort(, );
}
$article->delete();
return response()->json(, );
}
Adım 5: API Yolu
Adım 5: API Yolu
routes/api.php dosyasını düzenleyin:
use App\Http\Controllers\Api\AuthController;
use App\Http\Controllers\Api\ArticleController;
Route::post(, [AuthController::, ]);
Route::post(, [AuthController::, ]);
Route::middleware()->group(function() {
Route::post(, [AuthController::, ]);
Route::apiResource(, ArticleController::);
});
Adım 6: Postman ile API CRUD Testi
Adım 6: Postman ile API CRUD Testi
| Metod | Uç Nokta | Fonksiyon |
|---|---|---|
| GET | /api/articles | Tüm makaleleri listele |
| POST | /api/articles | Yeni makale kaydet |
| GET | /api/articles/{id} | Makale detayları |
| PUT | /api/articles/{id} | Makale güncelle |
| DELETE | /api/articles/{id} | Makale sil |
Her istekte token’i header’da göndermeyi unutmayın:
Authorization: Bearer {token}
Örnek JSON Cevabı
Örnek JSON Cevabı
{
"id": 1,
"title": "Laravel API Öğrenmeyi",
"content": "Laravel API güçlü...",
"user_id": 1,
"created_at": "2026-01-11"
}
Neden Bu API Güvenli?
Neden Bu API Güvenli?
Sanctum + auth:sanctum ile, API’ye erişim token’sız yapılamaz. Her istekte kimlik doğrulaması yapılır ve yalnızca veri sahibinin kendi verilerini erişim ve değiştirme izni vardır.
Frontend’de Kullanmak İstersek
Frontend’de Kullanmak İstersek
- React: token’i localStorage’da saklayın, her istekte Authorization header’ında gönderin
- Axios: interceptor kullanarak otomatik token ekleyin
- Token’i kamu reposunda açığa çıkarmayın!
Hata Yönetimi & Durum Kodu
Hata Yönetimi & Durum Kodu
- 201 Created: Veri başarıyla oluşturuldu
- 200 OK: Veri başarıyla alındı/güncellendi
- 204 No Content: Veri silindi
- 401 Unauthorized: Token hatalı/sonlanmış
- 404 Not Found: Veri bulunamadı
- 422 Unprocessable Entity: Validasyon hatası
Yeni Başlayanların Yapabileceği Yaygın Hatalar
Yeni Başlayanların Yapabileceği Yaygın Hatalar
- Migrasyon/publish Sanctum yapmayı unutmak
auth:sanctummiddleware’ini unutmak- Header’da token göndermemek
Accept: application/jsonayarını unutmak- Sadece GET olan bir endpoint’e POST istek göndermek
- Route grubunu yanlış ayarlamak (middleware içinde olmalı)
Bir Sonraki Adım
Bir Sonraki Adım
- API Kaynağı (daha düzenli yanıtlar)
- Paginasyon ve filtreleme
- Roller ve izinler
- Thunder Client ile test etme
🚀 Tartışabilelim & Paylaşalım!
🚀 Tartışabilelim & Paylaşalım!
Bir adımda takıldığınızda yorum bırakın. Aynı zamanda Laravel’de API CRUD yapma deneyiminizi paylaşın veya daha ileri bir konu isteğinde bulunun (API Kaynağı, paginasyon, vb.).
Kaynaklar:
Kaynak: Orijinal Makale


