Temel Kavramlar Sürüm: 11.x
Topluluk Dokümantasyonu

Denetleyiciler (Controllers)

Özet: Laravel denetleyici mimarisi, tek aksiyonlu denetleyiciler, RESTful kaynak denetleyicileri ve bağımlılık enjeksiyonu.

Denetleyiciler (Controllers)

Tüm istek işleme mantığınızı rota dosyalarında Closure'lar halinde tanımlamak yerine, bu davranışı Denetleyici (Controller) sınıflarını kullanarak organize edebilirsiniz. Denetleyiciler, ilgili istek işleme mantığını tek bir sınıf altında gruplandırmanızı sağlar.

Örneğin bir UserController sınıfı; kullanıcıları görüntüleme, oluşturma, güncelleme ve silme gibi kullanıcı yönetimiyle ilgili tüm istekleri işleyebilir. Denetleyiciler varsayılan olarak app/Http/Controllers dizininde saklanır.


Temel Denetleyiciler

Yeni bir denetleyici oluşturmak için make:controller Artisan komutunu kullanabilirsiniz:

php artisan make:controller UserController

Örnek bir denetleyici sınıfı:

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\View\View;

class UserController extends Controller
{
    /**
     * Belirtilen kullanıcının profilini göster.
     */
    public function show(string $id): View
    {
        return view('user.profile', [
            'user' => User::findOrFail($id),
        ]);
    }
}

Bu denetleyici yöntemine bir rota tanımlamak için:

use App\Http\Controllers\UserController;

Route::get('/user/{id}', [UserController::class, 'show']);

Gelen istek /user/{id} URI'si ile eşleştiğinde, UserController sınıfındaki show yöntemi çalıştırılacak ve rota parametreleri bu yönteme aktarılacaktır.


Tek Aksiyonlu Denetleyiciler (Single Action Controllers)

Bir denetleyici eylemi özellikle karmaşıksa veya tek bir iş yapıyorsa, tüm denetleyiciyi tek bir eyleme ayırabilirsiniz. Bunun için denetleyici içinde __invoke sihirli yöntemini tanımlamanız yeterlidir:

php artisan make:controller ProvisionServerController --invokable

Denetleyici içeriği:

<?php

namespace App\Http\Controllers;

use App\Models\Server;
use Illuminate\Http\RedirectResponse;

class ProvisionServerController extends Controller
{
    /**
     * Yeni bir sunucu hazırla.
     */
    public function __invoke(Server $server): RedirectResponse
    {
        // Sunucu hazırlama işlemleri...

        return redirect()->route('servers.index');
    }
}

Tek aksiyonlu denetleyicileri rotaya bağlarken yöntem adı belirtmeniz gerekmez:

use App\Http\Controllers\ProvisionServerController;

Route::post('/server/{server}/provision', ProvisionServerController::class);

RESTful Kaynak Denetleyicileri (Resource Controllers)

Laravel kaynak yönlendirmesi (resource routing), tipik CRUD (Create, Read, Update, Delete) rotalarını tek bir satır kodla denetleyiciye atar.

Hızlıca kaynak metotları içeren bir denetleyici oluşturmak için --resource bayrağını kullanabilirsiniz:

php artisan make:controller PhotoController --resource

Ardından bu denetleyiciye kaynak rotasını tanımlayın:

use App\Http\Controllers\PhotoController;

Route::resource('photos', PhotoController::class);

Kaynak Denetleyicisi Eylemleri Tablosu

Fiil URI Eylem (Action) Rota Adı
GET /photos index photos.index
GET /photos/create create photos.create
POST /photos store photos.store
GET /photos/{photo} show photos.show
GET /photos/{photo}/edit edit photos.edit
PUT/PATCH /photos/{photo} update photos.update
DELETE /photos/{photo} destroy photos.destroy

Kısmi Kaynak Rotaları (Partial Resource Routes)

Yalnızca belirli eylemleri kaydetmek veya bazılarını hariç tutmak için only veya except yöntemlerini zincirleyebilirsiniz:

Route::resource('photos', PhotoController::class)->only([
    'index', 'show'
]);

Route::resource('photos', PhotoController::class)->except([
    'create', 'store', 'update', 'destroy'
]);

API Kaynak Rotaları (API Resource Routes)

HTML görünümleri sunmayan API'ler için create ve edit HTML formu rotalarına ihtiyaç duyulmaz. Bunun için apiResource yöntemini kullanabilirsiniz:

Route::apiResource('photos', PhotoController::class);

Birden fazla API kaynak denetleyicisini toplu kaydetmek için apiResources kullanılabilir:

Route::apiResources([
    'photos' => PhotoController::class,
    'posts' => PostController::class,
]);

Bağımlılık Enjeksiyonu ve Denetleyiciler

Yapıcı Metot Enjeksiyonu (Constructor Injection)

Laravel Hizmet Konteyneri (Service Container), tüm Laravel denetleyicilerini otomatik olarak çözer. Bu sayede denetleyicinizin kurucu metodunda (__construct) ihtiyaç duyduğunuz bağımlılıkları tip belirterek isteyebilirsiniz:

<?php

namespace App\Http\Controllers;

use App\Repositories\UserRepository;

class UserController extends Controller
{
    public function __construct(
        protected UserRepository $users,
    ) {}

    public function index()
    {
        return $this->users->all();
    }
}

Metot Seviyesinde Enjeksiyon (Method Injection)

Kurucu metodun yanı sıra, denetleyici eylem metotlarında da bağımlılıkları tip belirterek enjekte edebilirsiniz. Örneğin Illuminate\Http\Request nesnesi:

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Yeni bir kullanıcı kaydet.
     */
    public function store(Request $request): RedirectResponse
    {
        $name = $request->input('name');

        // Kullanıcıyı veritabanına kaydet...

        return redirect('/users');
    }
}

Eğer denetleyici yönteminiz hem bir bağımlılık hem de rota parametresi alıyorsa, önce bağımlılıkları ardından rota parametrelerini sıralayın:

use Illuminate\Http\Request;

Route::put('/user/{id}', [UserController::class, 'update']);

public function update(Request $request, string $id): RedirectResponse
{
    // ...
}
Bu sayfa açık kaynaklı olarak topluluk tarafından güncellenmektedir.
Dokümantasyon Başına Dön ↑