logo

CakePHP - vytvorenie a testovanie jednoduchej aplikácie

cakephp

 

 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.

aplikácia

             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.

 

Výsledky PHP depend pre CakePHP

Výsledky PHP depend pre CakePHP

 

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

 

cakephp vysledky meranie v JMeter

 

zdrojový kód aplikácie  >> na stiahnutie




                             

logo