CakePHP - vytvorenie a testovanie jednoduchej aplikácie

Začiatky CakePHP siahajú do roku 2005, kedy
Michal Tatarynowicz vytvoril minimalistický
framework nazvaný Cake.
Tento framework vydal neskôr pod licenciou MIT, čím položil základ pre dnešný CakePHP open source projekt, ktorý vyvíja Cake Software Foundation. Jedná sa o framework postavený na skriptovacom jazyku PHP. Jednou z najväčších predností CakePHP je, že v jeho základnej kostre je inšpirovaný zrejme najlepším frameworkom súčasnosti, a to Ruby on Rails. CakePHP je framework s bohatou softvérovou výbavou, ktorá ja vhodná na veľké i malé projekty. Má za sebou širokú komunitu zabezpečujúcu neustále napredovanie projektu spolu s tvorbou kvalitnej dokumentácie API a rôznych manuálov. Okrem štandartných helperov podporuje aj helpery pre Ajax a RSS. Jeho komunita poskytuje veľké množstvo pluginov a návodov, čo len zvyšuje popularitu tohto frameworku.
Framework CakePHP je od základu dobre postaveným projektom, všetko je v ňom dobre premyslené a štruktúrované a po krátkom čase sa programátor rýchlo zorientuje. Validácia vstupných dát je dobre zapracovaná v rámci modelu a poskytuje dostatočné pokrytie tejto citlivej časti každej bezpečnej aplikácie. Dokumentácia API a rôzne návody sú prístupné v dobrom množstve a vo veľkom množstve jazykov.

Ako prvé treba správne nakonfigurovať spojenie s databázou a konfiguračný súbor, ktorý je na to určený sa nachádza v adresári /app/config/database.php .
<?php
class DATABASE_CONFIG {
var $default = array(
'driver' => 'mysql','persistent' => false,
'host' => 'sql.ukazka.sk',
'login' => 'prihlasovacie meno',
'password' => 'prihlasovacie heslo','database' => 'meno databázy',
'prefix' => '',);
}
?>
Ďalej sa musí vytvoriť súbor v adresári /app/models, ktorý bude obsahovať zadefinovanie tabuľky v databáze. Meno súboru a tabuľky je vhodné používať v anglickom jazyku. Tento súbor obsahuje opis modelu danej tabuľky, vzťahy s ďalšími tabuľkami a pravidlá na validáciu dát pri ukladaní alebo editovaní.
<?php
class User extends AppModel{
var $name = 'User';var $belongsTo = array(
'Member' => array('className' => 'members',
'foreignKey' => 'id_member','conditions' => '',
'fields' => '','order' => ''
)
);
} ?>
Na tomto kóde môžeme vidieť ako sa implementuje vzťah belongs to ( 1:1 ) , kde je vidieť, že stačí mať dobre navrhnutú tabuľku a správne pomenované názvy atribútov a CakePHP spraví zvyšok. Rozpozná cudzie kľúče, primárne kľúče a vzťahy medzi tabuľkami. Vďaka scaffolding je možné na základe takto zadefinovaného modelu vygenerovať dočasnú aplikáciu, ktorá nám dokáže pridávať, editovať, mazať a prehliadať záznamy z tabuľky. Ak je scaffolding funkčný znamená to, že náš model pracuje správne a vzťahy medzi tabuľkami sú dobre zadefinované.
Po vytvorení modelu môžeme následne vytvoriť súbor kontrolór, ktorý bude slúžiť ako logická obsluha daného modelu. Súbor sa umiestňuje do adresára /app/controllers a pridelí sa mu meno podľa modelu napr. users_controller.php. Kontrolór obsahuje všetky zadefinované funkcie, ktoré môžu byť v rámci tohto modelu použité.
<?php
class UsersController extends AppController {
var $name = 'Users';var $uses = array('User', 'Member');
function index() {
$this->User->recursive = 0;$this->set('users', $this->paginate());
}
function view($id = null) {if (!$id) {
$this->Session->setFlash(__('Invalid User.', true));$this->redirect(array('action'=>'index'));
}$this->set('user', $this->User->read(null, $id));
}
function add() {if (!empty($this->data)) {
$this->User->create();if ($this->User->save($this->data)) {
$this->Session->setFlash(__('The User has been saved', true));$this->log(__('The User has been saved', true), LOG_DEBUG);
$this->redirect(array('action'=>'index'));} else {
$this->Session->setFlash(__('The User could not be saved. Please, try again.', true));}
}
$arrays= Array();$this->loadModel('Member');
$values = $this->Member->find('all');
foreach ($values as $aux) {$arrays[$aux['Member']['name']]= $aux['Member']['id'];
}$this->set('selector_info1',$arrays);
}}
}?>
Po nadstavení modelu a controlleru nasleduje vytvorenie súboru view. Súbor pohľadu má na starosti zobrazenie požiadaviek, ktoré sú požadované od controlleru, ako napríklad zobrazenie užívateľa. Často je v podobe HTML, XML, JSON ale view môže byť tiež v podobe streamovaného súboru, alebo PDF, ktoré si môžu užívatelia stiahnuť. Tieto súbory sú napísané v plain PHP a ich prípona je CTP (CakePHP Template). Tieto súbory obsahujú prezentačnú logiku, ktorá má na starosti správne zobrazenie údajov, ktoré jej poskytol controller. Celá vrstva view sa dá rozložiť na viacero častí. Jednou z nich je layout, ktorý rozdeľuje celý web do viacerých blokov a v nich sú zobrazené konkrétne view výstupy, alebo statické časti ako hlavička stránky a pod. .
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN" "http://www.w3.org/TR/xhtml1/
DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content=
"text/html; charset=UTF-8" />
<title> Diplomový projekt</title> <? echo $html -> css("cake.generic"); ?>
</head><body>
<div id="container"> <div id="header"><?php echo $html->link(__('Members', true), '/members'); ?>
<?php echo $html->link(__('Users', true), '/users'); ?></div>
<?
if ($session->check('Message.flash')):$session->flash();
endif;
?>
<div id="content"><?php echo $content_for_layout ?>
</div>
<div id="footer" ><? echo $html->image('cake.power.gif', array('align' => 'left')); ?>
<a href="mailto:tomas@edoma.sk" >Vyrobil Tomáš Bohunický</a></div>
</div></body>
</html>
Ďalšou súčasťou je element, ktorý sa používa opakovane vo view a tvorí ho krátky zdrojový kód. Poslednou časťou je trieda helper, jednoduchý view súbor, ktorý sa nachádza na viacerých miestach layoutu. Helper ako už názov napovedá je pomôcka, ktorá môže napríklad generovať dokumenty a CakePHP má helpery pre JS, RSS, AJAX, XML. Jednoduchou ukážkou je použitie objektu html a jeho metódy link. Tento helper nám vygeneruje jednoduchý odkaz s prázdnou url adresou.
HtmlHelper::link ($title, $url = null,
$htmlAttributes = array(),
$confirmMessage = false,
$escapeTitle = true
)
View súbor, ktorý má na starosti prezentovať napríklad editáciu užívateľa sa nachádza v adresári /app/views/users/edit.ctp a jeho obsah môže vyzerať nasledovne.
<div class="users form">
<?php echo $form->create('User' , array('action' => 'edit'));?>
<fieldset><legend><?php __('Edit User');?></legend>
<?php echo $form->input("id_member");echo $form->input("name");
echo $form->input("surname");echo $form->input("phone");
echo $form->input("email");?> </fieldset>
<?php echo $form->input('id', array('type'=>'hidden'));?><?php echo $form->end('Submit');?>
</div><div class="actions">
<ul><li><?php echo $html->link(__('Delete', true),
array('action'=>'delete', $form->value('user.id')),
null, sprintf(__('Are you sure you want to delete # %s?',
true), $form->value('user.id'))); ?>
</li>
<li><?php echo $html->link(__('List users', true),
array('action'=>'index'));?>
</li>
</ul></div>
Aby bola aplikácia hotová ešte treba vytvoriť súbory model, controller a view aj pre tabuľku members. Po nakódovaní aj týchto posledných častí sa aplikácia umiestni na doménu, ktorá je poskytovaná zadarmo, ako naúríklad na adrese http://cakephp.getfreehosting.co.uk/. Na tejto adrese prebehlo aj testovanie aplikácie. Posledným krokom je vytvorenie databázy, ktorá bude slúžiť ako úložisko dát.
-- phpMyAdmin SQL Dump
-- version 3.2.2.1deb1
-- http://www.phpmyadmin.net
CREATE TABLE IF NOT EXISTS `members` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_slovak_ci NOT NULL,
`street_number` varchar(255) COLLATE utf8_slovak_ci NOT NULL,
`street` varchar(255) COLLATE utf8_slovak_ci NOT NULL,
`town` varchar(255) COLLATE utf8_slovak_ci NOT NULL,
`ZIP code` varchar(255) COLLATE utf8_slovak_ci NOT NULL,
`type` varchar(255) COLLATE utf8_slovak_ci NOT NULL,
`login` varchar(255) COLLATE utf8_slovak_ci NOT NULL,
`password` varchar(255) COLLATE utf8_slovak_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
COLLATE=utf8_slovak_ci AUTO_INCREMENT=2 ;
-----------------------------------------------------------
CREATE TABLE IF NOT EXISTS `users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`member_id` bigint(20) NOT NULL,
`name` varchar(255) COLLATE utf8_slovak_ci NOT NULL,
`surname` varchar(255) COLLATE utf8_slovak_ci NOT NULL,
`phone` varchar(255) COLLATE utf8_slovak_ci NOT NULL,
`email` varchar(255) COLLATE utf8_slovak_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
COLLATE=utf8_slovak_ci AUTO_INCREMENT=20 ;
Po vytvorení databázy a spustení aplikácie na danej doméne zostáva už len skontrolovať funkčnosť každej funkcie, ktorá tam je implementovaná, aby aplikácia pracovala tak ako bolo navrhnutá. Ak sú všetky tieto časti úspešne ukončené, môže začať testovanie samotného frameworku CakePHP. Testovanie bude mať dve časti, a to testovanie pomocou PHP_Depend a pomocou JMeter. Výsledky testovania pomocou PHP_Depend môžeme vidieť na týchto obrázkoch.


|
Udalosť |
Vzorky |
Priemer [ms] |
Stredná hodnota [ms] |
Min [ms] |
Max [ms] |
Priepustnosť |
|---|---|---|---|---|---|---|
|
Test č. 1 |
||||||
|
AddUser |
10 |
3346 |
3432 |
1025 |
4998 |
17,9/min |
|
Users |
10 |
1587 |
1972 |
425 |
3013 |
37,5/min |
|
Members |
10 |
1055 |
293 |
256 |
2855 |
56,3/min |
|
EditUser |
10 |
2671 |
2778 |
965 |
4996 |
22,4/min |
|
Celkovo |
40 |
2164 |
2047 |
256 |
4998 |
27,6/min |
|
Test č. 2 |
||||||
|
AddUser |
10 |
2285 |
2259 |
1002 |
3012 |
26,1/min |
|
Users |
10 |
1744 |
1982 |
434 |
3131 |
34,2/min |
|
Members |
10 |
776 |
297 |
233 |
2766 |
1,3/sec |
|
EditUser |
10 |
2150 |
2124 |
985 |
3154 |
27,8/min |
|
Celkovo |
40 |
1739 |
1980 |
233 |
3154 |
34,3/min |
|
Test č. 3 |
||||||
|
AddUser |
10 |
2436 |
2425 |
971 |
4483 |
24,4/min |
|
Users |
10 |
1709 |
1972 |
420 |
3004 |
34,8/min |
|
Members |
10 |
800 |
274 |
244 |
2753 |
1,2/sec |
|
EditUser |
10 |
2143 |
2009 |
962 |
3152 |
27,8/min |
|
Celkovo |
40 |
1772 |
1972 |
244 |
4483 |
33,5/min |













