Controller
Controller uygulamanızın kalbidir, HTTP istemlerinin nasıl işleneceğine karar verirler.
- Controller Nedir?
- Merhaba Dünya!
- Fonksiyonlar
- URI Parçasıyla Fonskyionuna Değişken Aktarma
- Varsayılan Controller'i Tanımlama
- Remap Fonksiyonunu Çağırmak
- Çıkış Bilgilerini Kontrol Etmek
- Özel Fonksiyonlar
- Controller Dosyalarınızı Alt-dizinlerle Organize Edin
- Sınıf Yapıcılar
- Rezerve Fonksiyon İsimleri
Controller Nedir?
Controller URI ile bağlı gelen basit bir sınıfın ismidir.
URI'yi düşünün:
example.com/index.php/blog/
Yukarıdaki örnekte, CodeIgniter blog.php isimli controllerı bulup yüklemeyi dener.
Controller adı URI'nin ilk parçasındaki isimle eşleştiğinde, yüklenecektir.
Hadi dene: Merhaba Dünya!
Hadi basit bir controller yaratalım ve sonucu görelim. Metin düzenleyicini kullanarak blog.php isimli bir dosya yarat, ve aşağıdaki kodları içine ekle:
Daha sonra dosyanı application/controllers/ dizini altına kayıt et.
Şimdi siteni aşağıdakine benzer URL ile ziyaret et:
example.com/index.php/blog/
Eğer doğru yaptıysan, Merhaba Dunya! yazısını göreceksin.
Not: Sınıf ismi mutlaka büyük harfle başlamalıdır. Diğer bir deyişle, şu geçerlidir:
<?php
class Blog extends Controller {
}
?>
Bu geçerli değildir :
<?php
class blog extends Controller {
}
?>
Ayrıca, her zaman controller'ınızın extends olarak ana controller dosyasını gösterdiğinden emin olun, çünkü bu bütün fonksiyonları aktarmak için gereklidir.
Fonksiyonlar
Yukarıdaki örnekte fonksiyon ismi index()'dir. Eğer URI'de ikinci parça boş ise index() fonksiyonu doğrudan yüklenir. "Merhaba Dünya" mesajını yüklemek için diğer bir yol da şudur:
example.com/index.php/blog/index/
URI'deki ikinci parça controller'deki hangi fonksiyonun çağrılacağına karar verir.
Hadi dene. Controller dosyana yeni bir fonksiyon ekle:
Şimdi aşağıdaki URL ile comment fonskiyonunu yükle:
example.com/index.php/blog/comments/
Yeni mesajı gördün mü?
URI Parçasıyla Fonskyionuna Değişken Aktarma
Eğer URI iki den fazla parçalı ise, bu parçalar fonksiyona parametre olarak aktarılır.
Örneğin, URI şöyle olsun:
example.com/index.php/products/shoes/sandals/123
Fonksiyona URI parçalarından 3 ve 4 aktarılır ("sandals" ve "123"):
<?php
class Products extends Controller {
function shoes($sandals, $id)
{
echo $sandals;
echo $id;
}
}
?>
Önemli: Eğer URI Yönelendirme özelliği kullanıyorsanız, fonksiyona gönderidiğiniz parçalara göre yeniden düzenlemeniz gerekir.
Varsayılan Controller'i Tanımlamak
CodeIgniter, kök URL istenildiği zaman olduğu gibi URI içinde tanımlı değilse varsayılan controller'ı yükler. Varsayılan controller'ı tanımlamak için, application/config/routes.php dosyasını açarak şu değişken düzenlenir:
$route['default_controller'] = 'Blog';
Burada Blog kullanmak istediğiniz controller sınıfının adıdır. Eğer şimdi ana index.php dosyasını URI parçası belirtmeden yüklerseniz, "Merhaba Dünya" mesajı varsayılan sayfa oalrak gelecektir.
Remap Fonksiyonunu Çağırmak
Yukarıda bahsettiğimiz gibi, URI'nin ikinci parçası controller'daki hangi fonksiyonun çağrılacağına karar verir. CodeIgniter _remap() fonksiyonu kullanımıyla bu davranışın üzerine yazmanıza izin verir:
function _remap()
{
// Some code here...
}
Önemli: Eğer controller'ınızda _remap() isimli fonksiyon varsa, URI içerği ne olursa olsun daima onu çağırır. Normal davranış olan URI'deki parçalara göre fonskiyon çağırmanın üzerine, sizin tanımladığınız yönlendirme kuralları yazılır.
Üstüne yazılan fonksiyonun çağırılmasıyla (genellikle URI'nin ikinci parçası) _remap() fonksiyonuna parametre aktarılır :
function _remap($method)
{
if ($method == 'some_method')
{
$this->$method();
}
else
{
$this->default_method();
}
}
Çıkış Bilgilerini Kontrol Etmek
CodeIgniter web tarayıcısına gönderdiği sonuç bilgisini dikkat edecek bir çıktı sınıfı vardır. Daha fazla bilgiyi Views ve Output sınıfı sayfalarında bulabilirsiniz. Bununla birlikte, bazı durumlarda, ekrana yazdırmadan önce bazı bilgilerinizi finalize etmek isteyebilirsiniz. CodeIgniter, controller dosyanıza _output() fonksiuonunu ekleyerek ekrana bastırmadan önce finalize etmenize izin verir.
Önemli: Eğer controller dosyanızda _output() isimli bir fonksiyon varsa, bilgiler ekrana yazdırılmak yerine çıktı sınıfı tarafından daima bu fonksiyon çağrılır. Fonksiyonun ilk parametresi finalize edilecek bilgiyi içerir.
İşte örnek:
function _output($output)
{
echo $output;
}
Lütfen dikkat, _output() fonksiyonuna finalize edilecek bilgi gönderilir. Karşılaştırma ve hafıza kullanım bilgileri gösterilir, önbellek dosyaları yazılır (eğer önbellek yazdırma opsiyonunu seçtiyseniz) ve başlık (eğer bu özelliği kullanıyorsanız) _output() fonksiyonuna dokunmadan önce gönderilir. Eğer sayfa yükleme zamanı ve hafıza kullanım istatistikleri özelliklerini kullanıyorsanız, bu bilgiler sonraki işlemler hesaba katılmadığı için doğru olarak gelmezler. Çıktıyı finalize etmeden önce kontrol için alternatif bir yol için Çıktı Sınıfına göz atınız.
Özel Fonksiyonlar
Bazı durumlarda kullandığınız bazı fonksiyonların genel kullanıma kapalı olmasını isteyebilirsiniz. Fonksiyonu özel yapmak için, adının önüne alt çizgi ekleyin ve böylece URL istemleriyle fonksiyon çalışmayacaktır. Örneğin, eğer şunun gibi bir fonksiyonunuz olursa:
function _utility()
{
// some code
}
URL'nizi aşağıdaki gibi girdiğinizde çalışmadığını göreceksiniz:
example.com/index.php/blog/_utility/
Controller Dosyalarınızı Alt-dizinlerle Organize Edin
Eğer büyük ölçekte uygulamalar inşaa edecekseniz, controller dosylaarınızı alt-dizinlerle organize etmek size uygun olacaktır. CodeIgniter bunu yapmanıza izin verir.
Basitçe application/controllers dizini altına kendi dizininizi açın ve controller sınıfınızı buraya yerleştirin.
Not: Bu özellik kullanılırken ilk URI parçası dizin adını göstermelidir. Örneğin, diyelimki controller dosyanız burada olsun :
application/controllers/products/shoes.php
Bu controller dosyanızı çağırmak için URI bilgisi şöyle bir şey olmalıdır:
example.com/index.php/products/shoes/show/123
Eğer URL alt-dizin içeriyorsa, her alt-dizin için varsayılan bir controller olmalıdır. Varsayılan controller bilgileri application/config/routes.php dosyasında işlenmelidir.
CodeIgniter ayrıca URI değerinizi yeniden yönlendirmenize URI Yönlendirme özelliği kullanılmasına da izin verir.
Sınıf Yapıcılar
Eğer niyetiniz kodunuzu Controller olarak kullanmaksa, aşağıdaki satrı MUTLAKA kodunuza eklemelisiniz:
parent::Controller();
Bu satırın gerekliliğinin nedeni, lokal yapıcı bölümün üzerine ana controller sınıfı olarak yazılmasının manuel olarak çağırmamız gerektiği içindir.
Eğer yapıcılara alışkın değilseniz PHP 4'te, yapıcı sınıf ile aynı adı taşıyan bir fonksiyondur:
<?php
class Blog extends Controller {
function Blog()
{
parent::Controller();
}
}
?>
PHP 5'te, yapıcıların imlası aşağıdadır:
<?php
class Blog extends Controller {
function __construct()
{
parent::Controller();
}
}
?>
Eğer bazı varsayılan değerlere ihtiyacınız varsa ya da varsayılan sınıfınızın bir destek sınıfına gereksinimi varsa, yapıcıların kullanımı işinizi kolaylaştırackatır. Yapıcılar geri sonuç vermezler ancak varsayılan bir işlemi yaparlar.
Rezerve Fonksiyon İsimleri
Controller sınıfınız ana controller uygulamasından genişletilmesi durumunda, kendi sınıfınıza vereceğiniz isimlere dikkat etmelisiniz, yoksa sınıflar kendi lokal sınıflarınızın üzerine yazılır. Rezerve İsimlerin tam listesini inceleyin.
Hepsi bu kadar!
Kısaca, controller hakkında bilmeniz gerekenler bu kadar.