Controller ve View Çekirdek Sınıflarını Oluşturmak

Controller çekirdek sınıfı, controllers dizininde oluşturduğumuz her controller sınıfını genişletmek (extend) için kullanacağımız sınıftır. Bu sayede view dosyalarını çağırıp, model sınıflarını kullanabileceğiz.

View Katmanının Çekirdek Sınıfı

/app/core/view.php:

class view
{
    /**
     * Görünüm dosyasını yorumlayan metod
     * @param string $view görünüm dosyası
     * @param array $params parametreler
     */
    public static function render($view, array $params = [])
    {
        /**
         * Eğer dosya varsa
         */
        if (file_exists($file = VDIR."/{$view}.php")) {
            /**
             * $params dizesindeki verileri extract fonksiyonu
             * ile değişken haline döndürüyoruz
             */
            extract($params);

            /**
             * Çıktı tamponlamasını başlatıyoruz
             */
            ob_start();

            /**
             * View dosyası içeriğini çağırıyoruz
             */
            require $file;

            /**
             * Çıktı tamponun içeriğini döndürüp siliyoruz
             */
            echo ob_get_clean();
        /**
         * Dosya yoksa programı sonlandır
         */
        } else {
            exit("Görünüm dosyası bulunamadı: $view");
        }
    }
}

Burada view sınıfı içerisine, statik bir render sınıfı oluşturuyoruz. Statik sınıflar, normal fonksiyonlar gibi ulaşılabilen sınıflardır. Burada bunu kullanmamızın özel bir sebebi yok.

Metod parametrelerinden aldığımız verilerle işlemlerimize devam edelim. View dosyasının varlığını kontrol ediyoruz ve varsa işlemlerimizi yapıyoruz. extract() fonksiyonu bir dizedeki değerleri alıp, değişkene çevirmemize yarıyor. Detaylarını, PHP’nin dökümantasyonunda bulabilirsiniz. ob_start() fonksiyonu ile çıktı tamponlamasını başlatıyoruz yani çıktıyı tampon belleğe alıyoruz. Akabinde view dosyamızı dahil edip ob_get_clean() fonksiyonu ile tamponladığımız çıktıyı temizleyerek yazdırıyoruz. Hepsi bu.

View katmanıyla olan işimiz yalnızca bu kadar. Şimdi gelelim Controller katmanının sınıfına. Bu katman, yaratacağımız bir Controller’a yardımcı olmak için işimize yarayacak. Yaratacağımız Controller’ı -sayfasını diyelim- genişleterek işlemlerimizi kolaylaştıracak. Haydi girişelim.

İlkin, render metodu ile view dosyası yorumlayacağız.

/app/core/controller.php:

class controller
{
	/**
	 * View dosyası çağırmamıza yarayan metod
	 * @param string $file dosyasını adını alır
	 * @param array $params parametreleri alır
	 * @return void view sınıfından render metodu döner
	 */
	public function render($file, array $params = [])
	{
		return view::render($file, $params);
	}
}

Yaptığımız şey çok basit, render metodu ile, view sınıfındaki render metodunu döndürdük. Yani kısacası view yorumlamak, view sınıfının işidir dedik. Şimdi, model işlemlerine bir göz atalım.

/app/core/controller.php (devamı):

class controller
{
	/**
	 * View dosyası çağırmamıza yarayan metod
	 * @param string $file dosyasını adını alır
	 * @param array $params parametreleri alır
	 * @return void view sınıfından render metodu döner
	 */
	public function render($file, array $params = [])
	{
		return view::render($file, $params);
	}

	/**
	 * Model dizininden model dosyası çağırır
	 * @param string $model model dosyası adı
	 * @return void model sınıfı
	 */
	public function model($model)
	{
		/**
		 * Eğer model dosyası varsa 
		 * çağırıp döndürelim
		 */
		if (file_exists($file = MDIR."/{$model}.php")) {
			require_once $file;
			/**
			 * Eğer model sınıfı tanımlıysa
			 * model sınıfını döndür
			 */
			if (class_exists($model)) {
				return new $model;
			/**
			 * Model sınıfı tanımlı değilse programı durdur
			 */
			} else {
				exit("Model dosyasında sınıf tanımlı değil: $model");
			}
		/**
		 * Eğer sınıf yoksa, hata döndürelim
		 */
		} else {
			exit("Model dosyası bulunamadı: {$model}.php");
		}
	}

	/**
	 * Yönlendirme yapar
	 * @param string $path yol
	 */
	public function redirect($path)
	{
		header("Location: {$path}");
	}

	/**
	 * URL oluşturur
	 * Bu sınıfı görünüm dosyası içinde rahat kullanmak için statik yaptık
	 * @return string URL
	 */
	public static function url()
	{
		return URL.'/?url='.implode('/', func_get_args());
	}
}

Sınıfa üç tane yeni metod ekledik. Bunlardan ilki olan model metoduna göz atalım. Bu metod, model dosyası çağırmak için işimize yarayacak olan metodumuz olacak. Böylelikle Controller ile model ilişkisini tamamlamış olacağız.

Evvela file_exists() fonksiyonu ile dosya varlığı kontrolü yapıyoruz ve varsa require_once() ile sayfaya dahil ediyoruz. require_once() kullanmamın sebebi, olası durumlarda sayfaya iki kere dahil edilmesini engellemek. Sonrasında sınıfın varlığını kontrol ediyoruz ve model metodunu bu sınıf olarak döndürüyoruz (new $model).

Gelelim redirect() metoduna, bu metod ihtiyaç halinde yönlendirmemizi yapıyor. URL’ye göre header’ı ayarlayıp, yönlendirmeye yardımcı oluyor. url() methodu ise URL dizgesi üretmemize yardımcı oluyor.

Olanlar bunlar. Dilersek eklemeleri kendi isteğimize göre yapabiliriz. Artık bir controller oluştururken, bu sınıfı genişleteceğiz (extend). Yani şöyle:

class blogController extends controller
{
	public function indexAction()
	{
		$blog_model = $this->model('blog'); // app/models/blog.php çağırır
		$this->render('blog/post.php'); // app/views/blog/post.php çağırır
	}
}

Kolay gelsin.

Adım adım:

  1. Yeni Başlayanlar İçin PHP’de MVC
  2. MVC Uygulaması İçin İlk Adımlar: App Sınıfı
  3. MVC’de Giriş Sayfası, Ayarlamalar ve İlk Controller
  4. Controller ve View Çekirdek Sınıflarını Oluşturmak (Şu an buradasınız)
  5. Model Katmanı ve Veritabanı İşlemlerini Kolaylaştırmak
  6. Proje/Uygulamanın Deposu
  7. Uygulamanın bitmiş halini indirin