Performans konusunda en kötü php frameworklerinden birisi şu an itibariyle cakephp olduğu için bu frameworkü tercih etmiyorum. (Örneğin şu makaleden benchmark karşılaştırmalarından birisini bulabilirsiniz) Ancak arama motorlarından “cakephp” anahtar kelimesi ile hatırı sayılır bir ziyaretçi kitlesi geldiği için cakephp ye başlangıç yapmak isteyen sevgili dostlarıma yardımcı olacak bir makale yazmayı uygun buldum.
Evet performans konusunda gerçekten kötü olmasına rağmen hiç mi güzel tarafı yok bu frameworkün? Performans kayıplarına rağmen neden insanlar bu frameworkü tercih ediyor?
Bu soruların en önceli cevabı, cakephp ‘nin sunduğu otomatikleşmiş araçlarda yatıyor. Framework’ün sunduğu araçlar sayesinde programcının yapması gereken bir çok şeyi cakephp kendisi otomatik olarak yapıyor. Tabii ki bunu yapabilmek için cakephp nin koyduğu kurallara uymak gerekiyor. Veritabanı tasarımı vs gibi konularda bazı konularda kod yazım kurallarına uymak gerekiyor. Bu durum cakephp camiası tarafından “Less Configuration, More Convention” (daha az konfigürasyon, daha çok geliştirme kuralı) şeklinde ifade ediliyor. Bunun ne demek olduğunu aşağıda göreceksiniz.
Diğer çoğu php framework gibi cakephp de MVC (Model, View, Controller) yaklaşımı ile oluşturulmuştur. Hatta Bu yaklaşıma en katı şekilde bağlı olan ve programcıyı MVC dışına çıkmamak için en çok zorlayan frameworklerden birisi cakephp’dir.
Yazımın devam eden kısımlarına geçmeden önce şuradaki yazımdaki MVC konusundaki açıklamaları okumanız çok iyi olur. Ayrıca bu yazıda okuyucuların, “php”, “php ile nesne tabanlı programlama”, “mvc yaklaşımı” hakkında bilgi sahibi olunduğu varsayıyorum. Bu konularda eksiğiniz olduğunu düşünüyorsanız lütfen ilgili konuları araştırınız.
CakePHP Nasıl Çalışır?
MVC yaklaşımını kullanan cakephp ‘de, uygulamadaki veri akışı şu şekilde olur;
1.İstek, kullanıcı verisi (get ve post verisi) aracılığı ile controllera iletilir.
2.Controller, isteği işler ve veritabanına erişmek için modele iletir.
3.Model, controller isteklerine, sonuç verisini göndererek ya da gönderilen verileri veritabanına ekleyerek karşılık verir.
4.Controller, modelden aldığı bu yanıtları, kullanıcıya göstermek amacıyla viewa gönderir.
5.Vİew, aldığı yanıtları belirlenen formatta kullanıcıya gösterir.
Less Configuration, More Convention (daha az konfigürasyon, daha çok geliştirme kuralı)
Bu kavram, konfigürasyondan çok, işi yaparken belli kurallara uymak anlamına gelir.
CakePHP ile çalışmaya başlamak için veritabanı adından başka bir konfigürasyon zorunluluğu yoktur. Bunun yerine “convention” denilen bir nevi “geliştirme kuralları” ya da “isimlendirme kuralları” denebilecek şartlar vardır. Örneğin: veritabanındaki alan isimleri, model-controller-view isimleri ve yerleri… Bunlar cakephp kurallarına göre isimlendirilip yerleştirilirse cake onları otomatik olarak bulur. Bu nedenle cakephp convetions konusunu iyi bilmek ve uygulamak gerekir. Bunu anlayıp uygulamaya alıştıktan sonra konfigürasyon konusuna vakit ayırmadan uygulama geliştirebilirsiniz.
Otomatik Kod Üretimi
“Baking script” olarak da bilinen cake bileşeni sayesinde, veritabanı tablolarını tanımlayarak cake in otomatik kod üretimi özelliğinden faydalanılabilinir. Bu sayede ihtiyacımız olan model, controller ve view ler otomatik olarak oluşturulur. Bu üretilen kodlar bize, veritabanı tablolarımız üzerinde crud (ekleme, okuma, düzeltme, silme) işlemleri yapabileceğimiz uygulamayı sağlar.
Veritabanı ile Hızlı Çalışma
“Cake database abstraction” sayesinde karmaşık sql sorguları ile uğraşmadan veritabanı üzerinde işlem yapabiliriz. Bu sayede sadece bir tablodan veri çekmenin yanısıra, ilişkili tablolalardaki verilerin hepsini yada bir kısmını aynı anda çekme şansımız olur. Örneğin “post” tablosunda gönderilen blog postlarını ve comments tablosunuda ilgili blog postuna yapılan yorumları tuttuğunu farzedelim. Bu durumda bir postla birlikte ilgili yorumları da çekmek istersek, post tablosundan bilgiyi dondüren tek bir model metodunu çağırmamız yeterlidir. Cake ilişkili diğer tablolardan (comments) da ilişkili verileri getirecektir. Diğer tablolardan da ilişkili verileri almak için karmaşık sql sorguları yazmamıza gerek yoktur.
Kurulum
Kurulum için gereksinimler;
- Apache kurulu ve çalışıyor olmalı
- Mysql kurulu ve çalışıyor olmalı
- Php 4.3.2 ve üzeri kurulu ve çalışıyor olmalı
- Cakephp son versiyonu kurulu ve çalışıyor olmalı
- mod_rewrite açık olmalı (httpd.conf )
- AllowOverride izni verilmiş olmalı (httpd.conf )
Öncelikle cakephp’nin resmi sitesinden en son sürümünü indirerek sıkıştırılmış dosyayı açarak sunucuya atıyoruz. Daha sonra cakephp’yi attığımız yerin url’sini tarayıcımıza yazarak frameworkü çalıştırıyoruz.
Sunucuda “mod_rewrite” açık (enabled) olmalı. Eğer aşağıdaki birinci görüntü geliyorsa çalışmaya hazırsınız. İkinci görüntüyü alıyorsanız. Apache mod_rewrite açık değil demektir. Bunun için apache httpd.conf dosyasındaki #LoadModule rewrite_module modules/mod_rewrite.so satırının başındaki # kaldırılarak sunucu tekrar başlatılarak ilgili modülün yüklenmesi sağlanır. (Eğer bir hosting kullanıyorusanız, muhtemelen httpd.conf dosyasına erişim hakkınız olmayacaktır. bu takdirde hosting firmanızla görüşerek konuyu halletmeniz gerekiyor.)
Örnek Uygulama
Veritabanımız;
CREATE TABLE tasks (
id int(10) unsigned NOT NULL auto_increment,
title varchar(255) NOT NULL,
done tinyint(1) default NULL,
created datetime default NULL,
modified datetime default NULL,
PRIMARY KEY (id)
);
[Convention] :Cakephp conventionları gereği veritabanındaki tablo isimleri (ingilizceki) çoğul olmalı ve her tablo, id isimli bir birincil anahtara (primary key) sahip olmalıdır
/app/config içindeki database.php.default dosyasını database.php olarak değiştirip aşağıdaki ayaları dosya içinden yapıyoruz;
var $default = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'root',
'password' => '',
'database' => 'caketoodoo',
'prefix' => '',
);
Sonrasında tarayıcımızda aşağıdaki ekranı almamız gerekir;
Uygulamamızın buraya kadarki kısmında cakephp’ye, veritabanımızı göstermiş olduk.
Model
Uygulamamızda tek bir tablo olduğu için, sadece bir adet model oluşturacağız.
/app/models dizini içinde task.php isimli dosya oluşturup aşağıdaki kodları içine ekliyoruz;
<?php
class Task extends AppModel {
var $name = 'Task';
}
?>
[Convention] Burada <?php den önce ve ?> den sonra herhangi bir boşluk tab vb olmadığından emin olunması gerekiyor.
[Convention] Model dosya adı temsil ettiği tablonun (ingilizce çoğul olan adının) tekil halidir. Yani veritabanı tablo adı tasks ise model dosya adı task.php olur.
[Convention] Model class adı, temsil ettiği tablonun (ingilizce çoğul olan adının) tekil halidir. Ayrıca ilk harfler büyüktür. . Yani veritabanı tablo adı tasks ise model class adı Task olur.
Model classı frameworkün AppModel classından extend edilir. Ayrıca AppModel classı da temel model classı olan Model den extend edilmiştir. Model isimli bu temel class, veritabanı ile ilgili crud işleri ile ilgili metodları barındırır.
Controller
/app/controllers içinde tasks_controller.php isimli dosya oluşturup, aşağıdaki kodları yerleştiriyoruz;
<?php
class TasksController extends AppController {
var $name = 'Tasks';
function index() {
$this->set('tasks', $this->Task->find('all'));
}
}
?>
[Convention] Burada da <?php den önce ve ?> den sonra herhangi bir boşluk tab vb olmadığından enim olunması gerekiyor.Bu örnekte bir modele bir controller karşılık geliyor ancak böyle olması, her modele bir controller karşılık gelemesi zorunlu değildir.
[Convention] Controller dosya ismi, veritabanındaki tablo adına aynen çoğul haliyle _controller.php eklenerek belirlenir. Yani uygulamamızda tablo adı tasks olduğu için controller adı tasks_controller.php olacaktır.
[Convention] Model class isimlerinde olduğu gibi controlller class isimlerinde de kelimelerin ilk harfleri büyük olur. Örneğimizde: tasks_controller.php isimli controller ın class ismi TasksController olacaktır.
Veritabanındaki Bütün Kayıtların Gösterilmesi
tasks_controller.php dosyası içinde, TasksController sınıfımıza, index isimli metodu aşağıdaki gibi ekleyelim. Controller içindekianonim fonksiyonlar (public functions) “action” olarak adlandırılır. tasks_controller.php dosyanız şu şekilde görünecektir;
<?php
class TasksController extends AppController {
var $name = 'Tasks';
function index() {
$this->set('tasks', $this->Task->find('all'));
}
}
?>
/app/views dizini içinde “tasks” isimli bir dizin oluşturuyoruz.
task dizini içinde index.ctp isimli bir dosya oluşturup aşağıdaki kodları kopyalıyoruz;
<h2>Tasks</h2>
<?php if(empty($tasks)): ?>
There are no tasks in this list
<?php else: ?>
<table>
<tr>
<th>Title</th>
<th>Status</th>
<th>Created</th>
<th>Modified</th>
<th>Actions</th>
</tr>
<?php foreach ($tasks as $task): ?>
<tr>
<td>
<?php echo $task['Task']['title'] ?>
</td>
<td>
<?php
if($task['Task']['done']) echo "Done";
else echo "Pending";
?>
</td>
<td>
<?php echo $task['Task']['created'] ?>
</td>
<td>
<?php echo $task['Task']['modified'] ?>
</td>
<td>
<!-- actions on tasks will be added later -->
</td>
</tr>
<?php endforeach; ?>
</table>
<?php endif; ?>
Tarayıcınız aracılığı ile …/tasks/index linkini çalıştırın. Aşağıdakine benzer şekilde veritabanımızda herhangi bir kayıt olmadığını gösteren çıktı alacaksınız;
Eğer veritabanımızda kayıt olsaydı burada tüm kayıtları görecektik.
Bu uygulama ile temel olarak cakephp çalışma mantığını, tipik bir uygulamanın nasıl olduğunu anlatmaya çalıştım. İleriki yazılarımda bu uygulamamıza yeni kayıt ekleme, değişiklik, silme gibi temel özellikleri nasıl ekleyeceğimizi anlatmaya çalışacağım.
Sevgiler
________________________ Etiketler: cakephp, cakephp başlangıç, cakephp kurulum, cakephp örnek uygulama, framework, php, php framework





merhaba
anlatımınız için teşekkür ederim.Ama herhangi bir application uluştururken ön tanımlı gelen yazıları nasıl kaldıracağınız onu da anlatırsanız sevinirim.(ön tanımlı derken mesela cakephp rapid development php framework yazısını ve aşağıdaki sorgu bölümünü)
iyi çalışmalar
açıkçası, ayrıntıya girilmeye kalkıldığında iş kitap yazmaya kadar gider. bu dökümanda cakephp ye giriş yapmayı hedefledim.
bahsettiğiniz konuyla ilgili olarak cakephp view konusunu incelemeniz gerekiyor.
uygulamanızın sunum katmanını view temsil ediyor ve istediğiniz gibi arayüz geliştirmenizi sağlıyor.
nasıl yapıldığına gelince yukarıdaki gibi bir makale yazmak lazım. fırsat bulunca birşeyler karalarım.
bu arada özellikle cakephp yi inceleyin derim özellikle …\cake\libs\view dizinin içindeki dosyaları inceleyin. sanırım kafanızda biraz canlanacaktır.
kolay gelsin
Şimdi üstadım bir sorum var. Ben cakephp yi localhostumda çalıştırabilmek için .htaccess dosyalarıma
RewriteBase /~has/framework/cake/ kodunu ekledim. Dolayısıyla ../tasks/index yazınca
Not Found The requested URL /~has/framework/task/index was not found on this server. şeklinde hata mesajı veriyor. Şimdi ben bu uygulamayı nasıl çalıştırabilirim.
İyi çalışmalar dilerim.
neden .htaccess içinde değişiklik yaptınız. eğer özel bir amacınız yoksa, bu dosya içinde herhangi bir değişikliğe gerek yok. framework ile gelen .htaccess dosyasını aynen kullanabilirsiniz.
Şöyle izah edeyim. Ben pardus 2008 kullanıyorum. Hostingim ile localhostumun ayarları farklı. Bu nedenle http://localhost/~has/framework/cake yazınca Not Found çıkıyordu. http://www.mengu.net/pardusta-cakephp-kurulumu/ adresinden sağolsun bir arkadaş çözümünü yayınlamış. Ama bu seferde senin uygulamanı yazınca problem yaşıyorum.
uygulaman /~has/framework/cake/ dizini içinde ise tarayıcıda ../tasks/index değil, şunu çağırman gerekiyor;
http://localhost/~has/framework/cake/task/index
Hımm. Yardımın için teşekkür ederim.