Selam,
Geçtiğimiz derste MVC ve REST yapılarına ufak bir giriş yapıp temel oluşturmuştuk. Bu derste biraz daha ilerliyoruz. Bugünkü konularım:
- Controller temelleri
- RESTful Controller
- Resource Controller
Controller Temelleri
İlk konumuz Controller yapısını görmek ve basit bir controller dosyası oluşturmak.
Bundan önceki derslerde herhangi bir işlem yapmak istediğimde sürekli routes.php üzerinde çalışıyordum. Sitemin urli için bir route oluşturup, kullanıcı bu urle ulaşınca yapılması gerekenleri bu route içinde belirtiyordum. Ama buraya kadar olan kısımlarda oluşturduğumuz örnek web siteleri 2-3 urle ve birkaç forma sahipti. Gerçek bir web sitesinde binlerce url ve birçok form olabilir. Tüm bunları routes.php altında toplayıp, yapılacak işlemler için yazılacak kodları düşünürsek routes.php nin karman çorman bir yapıya bürüneceğini tahmin edebiliriz.
Bu noktada devreye controller dosyalarımız giriyor. app/controllers dizini açarsak hali hazırda 2 adet controller dosyasının var olduğunu görürüz: BaseController.php ve HomeController.php
BaseController dosyasını ana controller dosyamız olarak düşünebiliriz. Oluşturduğumuz controller dosyalarını BaseControllerdan “extend” yapıyoruz. Dolayısıyla şimdilik BaseController dosyasına uzaktan bakıp dokunmamak daha iyi.
HomeController ise Laravel ile birlikte gelen örnek bir controller dosyası.
<?php
class HomeController extends BaseController {
public function showWelcome()
{
return View::make('hello');
}
}
3. satırda görüldüğü gibi HomeController , BaseController sınıfını kalıtımlamış. (Bu sözcüğü benim uydurduğumu anladınız sanırım)
HomeController sınıfımız showWelcome isminde bir fonksiyona sahip ve bu fonksiyonun görevi hello ismindeki view dosyasını döndürmek.
Şimdi routes.php dosyasını açarak HomeController ın showWelcome fonksiyonunu kullanacağım.
Route::get('/', "HomeController@showWelcome" );
İşte hepsi bu kadar! get() metoduna ikinci parametre olarak fonksiyon yerine <controller>@<metod> olarak controller ve metod adını yazmam yeterli.
Homecontroller içinde yeni bir metod oluşturup routes.php den bunu çalıştıralım:
class HomeController extends BaseController {
public function showWelcome()
{
return View::make("anasayfa");
}
public function hakkimizda(){
return "WEB SANATÇILARININ PHP FRAMEWORK'Ü";
}
}
Route::get('hakkimizda', "HomeController@hakkimizda" );
Şimdi de kendimize yeni bir controller oluşturalım. app/controllers içinde SelamController.php dosyasını oluşturup içine kodlarımı yazıyorum:
class SelamController extends BaseController{
public function karsilamaMesaji(){
return "Her sözün doğru olmalı; fakat her doğruyu söylemek, doğru değil";
}
}
Ve routes.php içinden bu metodu çalıştırıyorum:
Route::get('/', "SelamController@karsilamaMesaji" );
Routea gelen parametreleri controllera aktarmamız da mümkün:
routes.php:
Route::get('manav/{meyve?}', "SelamController@manav" );
SelamController.php:
class SelamController extends BaseController{
public function manav($meyve = null){
$meyveler = array("elma", "armut", "muz", "erik");
if($meyve == null) {
echo $meyveler[0]. "<br/>";
echo $meyveler[1]. "<br/>";
echo $meyveler[2]. "<br/>";
echo $meyveler[3];
} else {
if(in_array($meyve, $meyveler))
return "Bu meyve mevcut: ".$meyve;
else
return "Bu meyve yarına gelecek";
}
}
}
Basitçe bir kontroller bu şekilde işliyor. Şimdi seviyeyi biraz daha yükseltip Restful Controllera bakalım.

RESTful Controller
Projelerimizi sergilemek için bir web sitemiz olduğunu varsayıyorum. Müzik, film, kitap gibi farklı alanlarda projelerimiz olsun. Bu farklı kategorideki projelere ulaşmak için routes.php de hepsine bir yol tanımlaybiliriz. get("projeler/muzik"), get("projeler/film"), get("projeler/kitap") vb. gibi. Ya da localhost/projeler/ altındaki tüm urlleri ProjelerController dosyasına bırakabiliriz. Tabii ki bunun için ProjelerController dosyası oluşturup düzenlememiz gerekecek ama önce routes.php de localhost/projeler/ altındaki tüm urlleri nasıl ProjelerController a yönledireceğimize bakalım:
Route::controller("projeler", "ProjelerController");
Bu kod ile localhost/projeler/ altındaki tüm urlleri ProjelerController içinden kontrol etmemize olanak sağladık. Şimdi ProjelerController dosyamızı oluşturup ilk ayarlamaları yapıyorum:
class ProjelerController extends BaseController{
public function getIndex(){
return "Hoşgeldiniz! Projelerime göz atmak ister misiniz?";
}
}
getIndex metodu ile localhost/projeler url adresine ulaşınca bir mesaj döndürmesini istedik. Restful controller ile çalıştığımızda fonksiyonlara isim verirken uymamız gereken bir kural var. İsimlendirmeye hangi HTTP verb ü kullanacaksak onunla başlamalıyız. REST ile ilgili temel konuları geçen derste öğrendiğim şimdi bunlara değinmiyorum.
Şimdi localhost/projeler/muzik için yapılacak eylemleri belirleyelim. Yine ProjelerController üzerinde düzenleme yapıyorum:
public function getMuzik(){
return "Müzik projelerimin listesi...";
}
Şimdiye kadar get kullandık çünkü, ne zaman adres çubuğunda urli girip entera basarsak aslında GET eylemi gerçekleşiyor.
Eğer yeni bir proje eklemek istersek post eylemini kullanmalıyız. Sitemizin anasayfasında bir form olduğunu varsayıyorum ve gönder butonuna tıkladığımız zaman projeler/ekle url adresine yönlenecek. Formumuz basitçe şu şekilde olsun:
{{Form::open( array("url" => "projeler/ekle") )}}
{{Form::label("projeAdi", "Proje")}}
{{Form::text("projeAdi")}}
{{Form::submit("Ekle")}}
{{Form::close()}}
Şimdi ProjelerController içinde bu eylemi düzenleyelim:
public function postEkle(){
return "POST çalıştı";
}
Bu sefer get değil post ile metodumuzu isimlendirdik. Çünkü POST eylemi gerçekleşti.

Resource Controller
Şu ana kadar 2 adet Controller tipi öğrendik. İlki standart bir controller tipindeydi ve şu şekilde oluşturuyorduk:
Route::get("/", "HomeController@metodAdi");
İkincisi RESTful Controller şeklindeydi ve şu şekilde tanımlıyorduk:
Route::controller("projeler", "ProjelerController");
RESTful controller ile /projeler ve onun altındaki tüm urlleri kontrol edebiliyorduk.
Ve son controller tipimize geliyoruz: Resource Controller. “Resource” un ne olduğunu da bir önceki derste öğrenmiştim. Bu bölümde geçen dersteki yemek tarifleri sunan site örneği üzerinden devam edeceğim.
İlk olarak routes.php den nasıl resource controllera gideceğimize bakalım:
Route::resource("tarifler", "TariflerController");
resource metoduna ilk parametre olarak yine url ve ikinci parametre olarak yine controller dosyamızın adını gönderiyoruz. Bu ilk adımdı.
Geçen derste öğrendiğim üzere, kaynaklarıma bazı HTTP metodlarıyla müdahale edebiliyordum. Yemek tarifleri sitesi içinde hangi urlde hangi eylemin gerçekleşeceğine dair bir tablo hazırlamıştım. Laravel’in dökümantasyonunda bununla ilgili detaylı bir tablo mevcut. İsterseniz Türkçe olarak laravel.gen.trde de aynı tabloya ulaşabilirsiniz.
İlk adım olarak routes.php de tarifler urlini oluşturmuştum. Şimdi kaynaklarım üzerinde işlemler için, silme-ekleme-güncelleme vs., TariflerController altında gerekli metodları oluşturmam gerekli. Mesela
localhost/tarifleriçin tüm tarifleri listeleyecek,localhost/tarifler/ekleiçin yeni bir tarif oluşturmak için gerekli formu sunacak,localhost/tarifler/spagetti/guncelleiçin spagetti tarifini güncelleyecek
vb. metodları yazmam gerek. Bu kodları tek tek elimle yazacağım gibi Laravel’in "artisan" aracını kullanabilirim. Artisan, Laravel’in kök dizininde bulunuyor. Artisan otomatik olarak bizim için TariflerController dosyasını oluşturup, dökümantasyonda belirtilen fonksiyonları ekleyecektir.
Bunu gerçekleştirmek için PowerShell’i açıp Laravel’i kurduğumuz dizine gitmemiz lazım. Sonrasında şu kodu yazarak işlemi tamamlıyoruz:
php artisan controller:make TariflerController
İşlemi doğru şekilde gerçekleştirirseniz “Controller created succesfully!” mesajını alacaksınız. Ve app/controllers dizininde TariflerController.php dosyası oluşturulup içinde gerekli metodların hazırlandığını göreceksiniz. Aynen bunun gibi:
<?php
class TariflerController extends \BaseController {
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @return Response
*/
public function store()
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param int $id
* @return Response
*/
public function update($id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return Response
*/
public function destroy($id)
{
//
}
}

Yukarıda bizim için otomatik olarak eklenen metodların ne işe yaradığını daha iyi anlamak dökümantasyon sayfasındaki tabloyu incelebilirsiniz. Açıklayıcı olması için yemek tarifleri sitemiz üzerinden birkaç örnek veriyorum:
GETeylemi ilelocalhost/tariflerurli çalışırsaindexmetodu çalışacak.GETeylemi ilelocalhost/tarifler/createurli çalışırsacreatemetodu çalışacak.POSTeylemi ilelocalhost/tariflerurli çalışırsastoremetodu çalışacak.GETeylemi ilelocalhost/spagettiurli çalışırsashowmetodu çalışacak.
Bu şekilde diğer HTTP eylemlerinde controller dosyasında çalışacak metodları çözebiliriz. Şimdi TariflerController dosyamızda HTTP eylemlerine karşılık gerçekleştirmek istediğimiz kodları nasıl düzenleyeceğimizi öğrenelim:
İlk olarak yeni bir tarif eklemek istediğimizde ne yapacağımıza bakalım. Bunun için localhost/tarifler/create url’ini kullanabiliriz. Bu durumda TariflerController içindeki create metodunu düzenlememiz gerek. Bu metodun yeni tarif ekleme için gerekli olan formu getirdiğini varsayalım.
TariflerController.php:
public function create()
{
return "Yeni tarif ekleme için form varmış gibi...";
}
Eğer şimdi localhost/tarifler/create adresine gidersek bu mesaj bize döndürülecektir.
Eğer spagetti tarifini düzenlemek istersek localhost/tarifler/spagetti/edit urlini kullanacağız. Bu durumda TariflerController.php içindeki edit metodunu düzenlememiz gerekli. edit metodu bir $id parametresine ihtiyaç duyuyor. localhost/tarifler/spagetti/edit urlindeki spagetti bizim id miz olacaktır.
public function edit($id)
{
return $id. "için düzenleme formu varmış gibi...";
}
localhost/tarifler/spagetti/edit url ine gidersek yukarıdaki mesaj bizi karşılayacaktır. $id yerine spagetti yazacak.
Son olarak update metodunu düzenleyelim. update metodu da bir $id parametresi alıyor ve PUT eylemi ile çalışıyor. Yani verileri güncelleyip gönderdiğimiz formun metodu PUT olmalı. Bunun için PUT metoduyla çalışan basit bir form hazırlıyorum:
{{Form::open( array("url" => "tarifler/spagetti", "method" => "PUT") )}}
{{Form::label("tarif", "Tarif")}}
{{Form::text("tarif")}}
{{Form::submit("Güncelle")}}
{{Form::close()}}
Butona tıkladığım zaman, tarifler/spagetti de PUT eylemi gerçekleşecek. Yani TariflerController içindeki update metodunu düzenlemem lazım. $id olarak spagetti gelecek.
public function update($id)
{
return $id. " güncellendi";
}
Sırada Ne Var?
Evet, bir faydalı konunun daha sonuna geldik. Laravel’in üç tipteki controller yapısını öğrendim. Böylece MVC yapısının View ve Controller katmanlarını az buçuk öğrenmiş oldum. Ayrıca REST ve RESTful web uygulamalarına da giriş yaptım.
Sıradaki konum Model katmanı üzerine olacak ve ileri veritabanı işlemlerini öğreneceğim:
- Migration (Migrasyon)
- SchemaBuilder
- Seeding (Veri Ekleme)
- Models
- Eloquent ORM
- Veritabanı ilişkileri

Hatırlatma1: Laravel öğrenmek için bu linkteki eğitimi takip ediyorum ve öğrendiklerimi burada paylaşıyorum.Buraya tıklayarak eğitimin anasayfasına ulaşabilir ve kaynak kodlarını indirebilirsiniz.
Hatırlatma2: Lütfen eksik,hatalı ya da düzeltilmesi gereken bir şey farkederseniz bana bildirin.

Yorumlar