Controller – View Yükleme

Merhaba arkadaşlar,
Mobilhanem.com’ da yayınladığımız Codeigniter Dersleri setimize 4. yazımızla devam ediyoruz. Bu dersimizde Controller dosyasını yakından inceleyip Controller ve Controller’ a View Yüklemek,  Default Controller nasıl değiştirilir?, Codeigniter Url Yapısı, Controller’ a Action eklemek, .htaccess nedir? ve Url’ den Action’ a Parametre Gönderilmesi ve Url’ deki Parametrelerin Alınmasında segment Metodu Kullanımı gibi konulardan bahsedeceğiz. Dolayısıyla bu dersimiz hem teorik hem pratik bilgiler içeren bir ders olacak.

Geçtiğimiz yazıda bundan sonra application klasörünü inceleyeceğimizi söylemiştik. Bu yazımız ile birlikte kod yazarak Codeigniter’ ı daha da yakından tanımaya devam edeceğiz. Konuya giriş yapmadan önce benim konuları anlatırken kullandığım bilgisayarda 80 port’ u dolu olduğu için apache server 8080 port’ unu kullanacaktır. Bu konuyla ilgili detaylı olarak Codeigniter eğitim setinin 2. Dersinde bahsetmiştik o yazıya buradan ulaşabilirsiniz. Bu açıklamayı yapma sebebim ekran alıntılarında adres çubuğundaki adresin farklı olmasının sizde oluşturabileceği kafa karışıklığının önüne geçmek.

Controller ve Controller’ a View Yüklemek

Önceki derste açmış olduğumuz Kurulum projesini text editör ya da ide’ mizde açarak dersimize başlayalım. Açtığımız projede application klasörünün altındaki controllers (proje_dizini/application/controllers) klasörünün içindeki welcome.php dosyasını açalım. Welcome.php klasörü içinde aşağıdaki koda benzer bir kod göreceksiniz.

class Welcome extends CI_Controller {
   public function index()
   {
      $this->load->view('welcome_message');
   }
}

Kodda da gördüğünüz üzere Welcome aslında basit bir php sınıfıdır. Fakat onu basit php sınıflardan ayrı kılan şey CI_Controller sınıfından kalıtılmış olmasıdır.  CI_Controller sınıfından kalıtılmış olması onu basit bir php class’ ı olmaktan çıkarıp Controller haline getirmiştir. Controller içindeki metodlardan bahsederken action tabirini kullanacağım. Kısaca actionlar kullanıcıdan gelen istek doğrultusunda hangi işlemin yapılacağını belirten controller sınıfı içinde bulunan metodlardır. Yukarıdaki kod parçasında bulunan index metodundan bahsederken welcome controller’ ının içindeki index action’ u şeklide bahsedeceğim. Welcome Controller’ ının içindeki index action’ undan bahsedecek olursak, bu method son derece basit içinde sadece bir View yükleme işlemi yapılan bir action’ dur. Index action’ u içinde kullanılan $this anahtar sözcüğü nesne yönelimli dillerden de bilindiği üzere sınıfa ait değişken ya da methodlara ulaşmak için kullanılan bir anahtar sözcüktür. Php’ de sınıflara ait değişkenlere ya da fonksiyonlara ‘->’ şeklinde ulaşılır. (Başka nesne yönelimli programlama dillerinde ‘.’ (nokta)  ile ulaşıldığı gibi) Index action’ unda kullanılan,

$this->load->view('welcome_message');

satırı ile yapılan işlem views klasöründe bulunan welcome_message.php adındaki View’ ın sayfada yüklenmesidir.

$this->load->view

Yukarda bulunan satır bize application içindeki Views klasörünü referans eder. İçine aldığı parametre ise Views klasörü altında sayfaya yüklenmesini istediğimiz View’ ın yoludur. View metodu içinde welcome_message yazılıp welcome_message.php adındaki View’ ın yüklenmesi kafanızı karıştırmasın Codeigniterda yapılan view yükleme işlemlerinde .php dosya uzantısını yazmaya gerek yoktur. (Uzantı yazılmasa dahi Framework tarafından eklenmektedir.)

View Dosyasını Değiştirmek

Proje_dizini/application/Views/ dizini altındaki welcome_message.php isimli dosyayı açacak olursak Codeigniter ve dolayısıyla MVC yapısının gizemini çözmeye bir adım yaklaşmış oluruz. Dosyayı açtığımızda dosya içerisinde bulunan html ve css kodları sonucu karşılaştığımız Welcome to Codeigniter yazısını ve altında devam eden yazıların yüklendiğini anlamış oluruz. Bu sayfanın index action’ u ile yüklenen sayfa olduğuna emin olmak için welcome_message.php isimli dosya’ nın içeriğini tamamen sildikten sonra aşağıdaki kodları welcome_message.php dosyasının içine yapıştırarak test edebilirsiniz.

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
?>
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8">
	<title>Welcome to CodeIgniter</title>
</head>
<body>
<div>
	<h1>Codeigniter Ders 4 | Mobilhanem</h1>
</div>
</body>
</html>

Bu kodu yapıştırıp kaydettikten sonra sayfayı yenilediğinizde aşağıdaki resimde de görüldüğü gibi h1 etiketi seviyesinde Codeigniter Ders 4 | Mobilhanem yazdığını göreceksiniz. Demek ki welcome_message View dosyasının sayfamıza yüklenmesini sağlayan gerçekten de index action’  umuzmuş.

view test resmi

Şimdi ise aklınıza takılabilecek başka bir sorunun cevabını size anlatacak olursam o da açılan ilk sayfanın neden welcome controller’ ının index metodu olduğudur. Bunun sebebi Proje_dizini/application/config altında bulunan routes.php dosyası içinde bulunan,

$route['default_controller'] = 'welcome';

satırıdır. Bu satır ile default controller olarak welcome controller’ ı belirlenmiştir. Index action’ u ise bütün controllerlarda default olarak yüklenen ilk actiondur. Bu yüzden biz her proje dizinimize gittiğimizde açılan sayfa Welcome controller’ ının index action’ unun yüklediği View dosyasıdır.

Default Controller nasıl değiştirilir?

Projenizin konusu’ na göre Welcome isimli bir Controller projeniz için pekte anlamlı olmayabilir ve bu yüzden default controller’ ınızı değiştirmek isteyebilirsiniz. Bu başlık altında size default Controller’ ın nasıl değiştirileceğini anlatmaya çalışacağım.

Proje_dizini/application/config altında bulunan routes.php dosyası içinde bulunan

$route['default_controller'] = 'welcome';

satırını

$route['default_controller'] = ‘home’;

Şeklinde değiştirelim ve kaydedip dosyayı kapatalım. Bu işlemden sonra sayfamızı yüklediğimizde 404 Page Not Found hatasını alırız. Bu hata istek yapılan sayfanın bulunamadığı anlamına gelir ve olması gereken de budur. Çünkü biz hala home adında bir controller’ a sahip değiliz. Proje_dizini/application/controllers dizini altında home adında bir php dosyası oluşturalım. Bu dosyayı oluşturduktan sonra içine aşağıda bulunan kodu yapıştıralım.

<?php
class Home extends CI_Controller
{

    public function index()
    {
        $this->load->view('welcome_message.php');
    }
}

Bu kodda bulunan index action’ unun welcome controller’ ındaki index actionundan hiçbir farkı yoktur, index action’ u yine application/views/ altında bulunan welcome_message isimli .php uzantılı dosyayı yüklemektedir. Şimdi sayfayı tekrar yenilediğimizde application/views/ altında bulunan welcome_message.php dosyasında bulunan html içerik ile karşılaşırız. Artık default Controller Home Controller olmuştur.

Codigniter Url Yapısı

Proje dizinimize gittiğimizde http://localhost/Mobilhanem/Kurulum/ yani arama çubuğumuzda bu şekilde bir url varken projemizin başlangıç sayfasının açıldığını gördünüz. Aklınıza şu soru takılmış olabilir, hani bu url’ deki Controller ve Action? İşte aklınıza takılmış olabilecek bu sorunun cevabı yine yukarıda bahsettiğimiz default controller ve defaul action (index) sorusunun cevabında gizlidir. Nasıl ki www.mobilhanem.com yazdığımızda direkt olarak bizi sunucunun içinde bulunan index.php sayfasına yönlendiriyorsa Codeigniterda da projemizin domaini olan (http://localhost:8080/Mobilhanem/Kurulum/) adrese gittiğimizde default Controller ve index action’ u application ile aynı dizinde bulunan index.php adlı php dosyasına parametre olarak gönderilir ve çalıştırılıp ekranımızda gösterilmiş olur. Parametre gönderme işlemi Get ile (url) aracılığıyla olur.

Controller’ a Action Eklemek

Home sayfamıza about adında yeni bir action ekleyelim. Bu action ekrana “Mobilhanem hakkında“ yazısını bassın. Şimdi biz bu Action’ un çalışıp çalışmayacağını test edelim.

<?php
class home extends CI_Controller
{
    public function index()
    {
        $this->load->view('welcome_message.php');
    }
    
    public function about(){
        echo "Mobilhanem hakkında";
    }
}

Ekleme işleminden sonra home controller’ ımızın içeriği bu şekilde olmalıdır. Şimdi about adındaki actionumuzu nasıl çalıştıracağımız hakkında düşünecek olursak about, home controller’ ına ait bir action’ dur dolayısıyla http://localhost:8080/Mobilhanem/Kurulum/Home/about şeklinde çalıştırılacağını düşünebilirsiniz, zaten mvc yapısında olması gereken url yapısı da budur. Bu url’ yi arama çubuğunuzda arattığınızda ise aşağıdaki sayfa ile karşılaşırsınız.

object not found resim

Bu sayfa ile karşılaşma sebebimiz projemizin application klasörü ile aynı dizinde bir .htaccess dosyasına sahip olmamasıdır. Peki .htaccess olmadan da about actionumuzu çalıştırabilir miyiz? Bu sorunun cevabı ise evet çalıştırabiliriz. Nasıl çalıştırabileceğimize gelecek olursak size önceki yazımda application ile aynı dizinde bulunan index.php dosyasını silmemeniz gerektiğinden bahsetmiştim. İşte bir controller içindeki action’ nun çalıştırılmasında görev alan dosya bu index.php dosyasıdır. Home controller’ ının about action’ unu application ile aynı dizinde bulunan index.php dosyasına GET ile parametre olarak göndererek about action’ unun çalışmasını sağlayabiliriz. Bunu yapmak için gerekli url aşağıdaki gibidir.

http://localhost:8080/Mobilhanem/Kurulum/index.php/Home/about

Bu adresi adres çubuğunuzda arattığınızda about action’ unuzun çalıştığını göreceksiniz. Codeigniter’ da GET işlemi yaparken soru işareti ve anahtar=değer ikilisi şeklinde bir url yapısı kullanmanıza gerek yoktur. Yukardaki url’ den örnek vericek olursak GET isteği ile gönderilen değerler (index.php dosyasına GET isteği yapıldığı için) Home ve about değerleridir. Index.php dosyasında bu isteği karşılayacak method, alacağı parametreler sayesinde bizim isteğimize cevap vermektedir.

Peki sizce bu tür bir url ne kadar temiz ya da mvc mimarisini kullanan bir framework için ne kadar uygun? Yazımızın başında da belirttiğimiz gibi mvc mimarisinde bir controller’ ın içindeki bir action’ u çalıştırmak için gerekli url www.mobilhanem.com/Controller_adi/Action_adi şeklinde olmalıdır. Url’ in bu şekilde olması için application ile aynı dizinde .htaccess (noktahtaccess) adında bir dosya oluşturalım. Oluşturduğumuz .htaccess dosyası özel bir dosyadır, bu dosyanın özelliklerinden yazının ilerleyen kısımlarında bahsedeceğim.

htaccess Dosyasının Düzenlenmesi

Şimdi .htaccess dosyasını düzenlemek için ide’ nizde ya da text editörünüzde açınız ve içine aşağıda yazan kodları yapıştırınız.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
  • 2. satırda : Gelen istek bir dosyaya denk gelmiyorsa
  • 3. satırda : Gelen istek bir klasöre denk gelmiyorsa
  • 4. satırda : Başında ve sonunda ne olursa olsun o verileri (parametreleri) al index.php dosyasına parametre olarak gönder. Sondaki [L] ise 2. ve 3. satırdaki şartlar sağlandığında çalışacak son kural olduğunu gösteriyor.

Bu kuralları yazdıktan sonra dosyayı kaydederek kapatmamız gerekmektedir. Bu kuralı yazdıktan sonra Controller’ larımızdaki Action’ larımıza http://localhost:8080/Mobilhanem/Kurulum/Controller_name/Action_name şeklinde istekte bulunabiliriz. Şimdi http://localhost:8080/Mobilhanem/Kurulum/Home/about şeklinde istekte bulunduğumuzda karşılaşacağımız sayfa aşağıdaki gibi olmalıdır.

htaccessten sonra istek resim

htaccess nedir?

.htaccess dosyasını şimdiye kadar MVC yapısına uygun link üretme amacıyla kullandık. Ek olarak .htaccess dosyasının özelliklerine değinecek olursak,

  • SEO uyumlu link yapısı
  • Botları engellemek
  • Spam engellemek
  • Yetki sınırlandırması

… gibi birçok özelliği bulunmaktadır.

Url’ den Action’ a Parametre Gönderilmesi

Bu yazımda .htaccess dosyasından bahsetmeden önce bir Controller’ ın Action’ una istek yaparken aslında bu isteğin application ile aynı seviyede bulunan index.php dosyasına yapılan bir GET isteği olduğundan bahsetmiştik. Şimdi ise Home Controller’ ı içinde bir Action oluşturarak Url’ den gönderilen bu parametrelerin Action tarafında nasıl karşılanacağına örnek vereceğiz.

Home Controller’ ının içine urldenParametreAl adında bir action oluşturalım. Bu action $ad, ve $soyad şeklinde iki adet parametre alsın ve aldığı bu değerleri ekrana bassın.

<?php


class home extends CI_Controller
{

    public function index()
    {
        $this->load->view('welcome_message.php');
    }

    public function about(){
        echo "Mobilhanem hakkında";
    }

    public function urldenParametreAl($ad,$soyad){
        echo "$ad $soyad";
    }
}

Eğer dediğim adımları yaptıysanız Home Controller’ ınızın içeriği bu şekilde olmalıdır. Şimdi adres çubuğundan bu Action’ a bir istekte bulunalım. İstek yaparken kullanacağımız url

http://localhost:8080/Mobilhanem/Kurulum/Home/urldenParametreAl/adiniz/soyadiniz

şeklinde olmalıdır. Bu isteği yaptıktan sonra action’ dan size dönecek yanıt aşağıdaki gibi olmalıdır.

urlden actiona parametre gönderilmesi resim

Parametreleri boş geçmek istediğinizde hata ile karşılaşmmak için Action parametrelerine aşağıdaki gibi default değerler verebilirsiniz.

public function urldenParametreAl($ad="",$soyad=""){
    echo "$ad $soyad";
}

Bu işlemden sonra parametreleri boş geçmeniz durumunda bile hata ile karşılaşmazsınız.

Url’ deki Parametrelerin Alınmasında segment Metodu Kullanımı

Url’ deki parametrelerin okunması için 2. Yöntem ise Codeigniter’ ın uri sınıfının segment methodunu kullanmaktır. Segment method içinde aldığı parametreye göre istenen segmenti geriye döndürür. Aşağıdaki urlden örnek verecek olursak,

http://localhost:8080/Mobilhanem/Kurulum/Home/urldenParametreAl2/mobilhanem.com/codeigniter_dersleri

segment metodu parametre olarak 1 değerini alırsa  geriye url’ de Controller adına denk gelen değeri (Home) döndürür, eğer 2 değerini alırsa Action adına denk gelen değeri (urldenParametreAl2) döndürür. Segment metodunda 2’ den sonra kullanılan değerler ise url’ de varsa eğer parametrelerin değerlerini döndürür.

Bu işlemi Home Controller’ ı içindeki urldenParametreAl2 Action’ u içinde örnekleyecek olursak.Yapacağımız örnekte adres çubuğundan yapacağımız istek http://localhost:8080/Mobilhanem/Kurulum/Home/urldenParametreAl2/mobilhanem.com/codeigniter_dersleri olacak yazmamız gereken action ise

public function urldenParametreAl2(){
    echo $this->uri->segment(1)."<br/>";
    echo $this->uri->segment(2)."<br/>";
    echo $this->uri->segment(3)."<br/>";
    echo $this->uri->segment(4)."<br/>";
}

şeklinde olmalıdır. Bu isteği yaptıktan sonra ise karşılaşacağımız sayfasegment metodu kullanımı resim

gibi olmalıdır…

Codeigniter Dersleri eğitim setinin 4. yazısını burada noktalıyorum. Konu ile ilgili sorularınızı Mobilhanem Soru&Cevap bölümünden sorabilirsiniz. Bir sonraki derste serimize Controller ve View arasında veri aktarımı ile devam edeceğiz.

Tüm Codeigniter Dersleri‘ ne buradan ulaşabilirsiniz.

4

Hüseyin Göztok

Yapı Kredi - Yazılım Mühendisi - Erciyes Üniversitesi (Lisans) 2013 - 2018

9 Yorum

    • Yorumunuz için teşekkür ederim. Serinin tamamlanması için elimden geleni yapacağım.

  • Çok güzel bir eğitim setine benziyor. İlk öğrenmeye çalıştığım framework ve iyi bir anlatıcıya denk geldiğim için şanslıyım teşekkür ederim.

  • Merhaba, öncelikle çok teşekkürler. Eğitim setiniz harika olmuş ancak benim takıldığım bir konu var yardımcı olursanız sevinirim. Ben link yapısını http://localhost/codeigniter3/Home/urldenParametreAl/Şahin/Çetinkaya/ olarak yaptığımda ve bunu sayfaya bastığımda ekranda %C5%9Fahin %C3%A7etinkaya yazıyor. Anlayacağınız Türkçe karakterler buradaki get metodunda bozuk olarak basılıyor. Bunu düzeltmenin bir yolu var mı yoksa bu normal bir durum mu? Yani bir form ile deneme şansım henüz olmadı ama acaba form olaylarında da mı aynı hatayı alacağız? Sonuçta url de Türkçe karakter olmaması normal olabilir belki ama diğer taraflarda da bu sorunla karşılaşıyor muyuz bu framework de? Teşekkürler şimdiden.

    • Yaşadığınız problem urlde Türkçe karakterlerin encode edilmesi ile ilgili normal bir durum. Çözüm için texti bastığınız sayfada texti decode edebilirsiniz. Texti decode etmek için urldecode fonksiyonunu kullanabilirsiniz. Fakat genelde urlde bu şekilde Türkçe karakterli parametre göndermek pek mantıklı değil. Eğer bunu seo uyumlu link yapısı oluşturmak için yapıyorsanız slug konusunu araştırmanızı tavsiye ederim. İyi günler.

  • sanırım baya bi şeyler değişmiş bahsettiğiniz şeylerin çoğu farklı şekillerde mevcut şu an cidden çok zorlanıyorum anlamak için. aslında anlıyorum ancak mevcut codeigniter sürümü ile karşılaştırınca işler karışıyor

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?