Başlarken
Görünüm ve Arayüz
Veritabanı ve ORM
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
{
// ...
}