logo

Zend Framework - vytvorenie a testovanie jednoduchej aplikácie

zend framework

         

              Spoločnosť Zend Technologies Ltd. stojí za vývojom a vznikom tohto veľmi spoľahlivého a výkonného PHP frameworku. Aktuálne vyšla verzia 1.10.3, ktorá opravuje niekoľko starších chýb a prináša ďalšiu sadu nových funkcií. Medzi výhody tohto frameworku patri využívanie unit testovanie kódu, znovu použiteľnosť komponentov, kvalitný manuál, šírenie pod BSD licenciu a jeho rýchlosť. Je vhodný na budovanie bezpečných, spoľahlivých a moderných WEB 2.0 aplikácií a webových služieb. Ponúka využitie bežne dostupných API od popredných výrobcov, ako Yahoo!, Google, Amazon, Flickr. Firma Zend prináša ešte ďalšie produkty, ktoré úzko súvisia s týmto frameworkom Zend Server a Zend Studio. Vďaka nim je vývoj v tomto frameworku ešte viac užívateľsky prívetivejší a udržuje všetky nástroje v aktualizovanom stave. Zend Studio je však určené pre profesionálov, ktorý sú za neho ochotný aj zaplatiť.

 

 

Tvorba testovacej aplikácie


      Najprv je potrebné vygenerovať základ aplikácie a to pomocou príkazu, ktorý je na tieto účely priamo zakomponovaný do Zend frameworku.



$ zf create project quickstart

     

       V konfiguračnom súbore application/config/application.ini sa nachádzajú základne nastavenia pre celú aplikáciu. Dôležité je správne nadstaviť spojenie s databázou, ktoré je nevyhnutné pre ďalšie kroky.

[production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
phpSettings.date.timezone = "Europe/London"
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.username = root
resources.db.params.password = root
resources.db.params.dbname = zenddb
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
resources.view.doctype = "XHTML1_STRICT"
[staging : production]
[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

 

      Základom pre prácu s tabuľkami v databáze je vytvorenie súboru application/models/DbTable/Users.php, ktorý bude obsluhovať všetky požiadavky ohľadom dát s tabuľky users vykonávané controllerom.


<?php
class Application_Model_DbTable_Users extends Zend_Db_Table_Abstract
{
protected $_name = 'users';
public function getUser($id)
{
$id = (int)$id;
$row = $this->fetchRow('id = ' . $id);
if (!$row) {
throw new Exception("Count not find row $id");
}
return $row->toArray();
}
public function addUser($member_id, $name, $surname, $phone, $email)
{
$data = array(
'member_id' => $member_id,
'name' => $name,
'surname' => $surname,
'phone' => $phone,
'email' => $email,
);
$this->insert($data);
}
public function updateUser($id, $member_id, $name, $surname, $phone, $email)
{
$data = array(
'member_id' => $member_id,
'name' => $name,
'surname' => $surname,
'phone' => $phone,
'email' => $email,
);
$this->update($data, 'id = '. (int)$id);
}
public function deleteUser($id)
{
$this->delete('id =' . (int)$id);
}
}

      Ďalším súborom je appliation/controller/IndexController.php a tento treba rozšíriť o základné funkcie na obsluhu požiadaviek pre tabuľku users. Medzi základnými funkciami sú napríklad výpis všetkých záznamov z tabuľky users, alebo zobrazenie len jedného konkrétneho záznamu a úprava konkrétneho záznamu.


<?php
class IndexController extends Zend_Controller_Action
{
public function init()
{
/* Initialize action controller here */
}
public function indexAction()
{
$this->view->title = "Users";
$this->view->headTitle($this->view->title);
$users = new Application_Model_DbTable_Users();
$this->view->users = $users->fetchAll();
}
public function addAction()
{
$this->view->title = "Add new user";
$this->view->headTitle($this->view->title);
$form = new Application_Form_User();
$form->submit->setLabel('Add');
$this->view->form = $form;
if ($this->getRequest()->isPost()) {
$formData = $this->getRequest()->getPost();
if ($form->isValid($formData)) {
$member_id = $form->getValue('member_id');
$name = $form->getValue('name');
$surname = $form->getValue('surname');
$phone = $form->getValue('phone');
$email = $form->getValue('email');
$users = new Application_Model_DbTable_Users();
$users->addUser($member_id, $name, $surname, $phone, $email);
$this->_helper->redirector('index');
} else {
$form->populate($formData);
} }}
public function editAction()
{
$this->view->title = "Edit user";
$this->view->headTitle($this->view->title);
$form = new Application_Form_User();
$form->submit->setLabel('Save');
$this->view->form = $form;
if ($this->getRequest()->isPost()) {
$formData = $this->getRequest()->getPost();
if ($form->isValid($formData)) {
$id = (int)$form->getValue('id');
$member_id = $form->getValue('member_id');
$name = $form->getValue('name');
$surname = $form->getValue('surname');
$phone = $form->getValue('phone');
$email = $form->getValue('email');
$users = new Application_Model_DbTable_Users();
$users->updateUser($id, $member_id, $name, $surname, $phone, $email);
$this->_helper->redirector('index');
} else {
$form->populate($formData);
} } else {
$id = $this->_getParam('id', 0);
if ($id > 0) {
$users = new Application_Model_DbTable_Users();
$form->populate($users->getUser($id));
}}}}

 

    Aby bola jedna časť aplikácie kompletne hotová treba ešte pripraviť aj súbor application/view/scripts/index/index.phtml a to pridaním zobrazovacej logiky pre spracovávané dáta.


<p><a href="<?php echo $this->url(array('controller'=>'index',
'action'=>'add'));?>">Add new user</a></p>
<table>
<tr>
<th>Member ID</th>
<th>Name</th>
<th>Surname</th>
<th>Phone</th>
<th>Email</th>
<th>&nbsp;</th>
</tr>
<?php foreach($this->users as $user) : ?>
<tr>
<td><?php echo $this->escape($user->member_id);?></td>
<td><?php echo $this->escape($user->name);?></td>
<td><?php echo $this->escape($user->surname);?></td>
<td><?php echo $this->escape($user->phone);?></td>
<td><?php echo $this->escape($user->email);?></td>
<td>
<a href="<?php echo $this->url(array('controller'=>'index',
'action'=>'edit', 'id'=>$user->id));?>">Edit</a>
<a href="<?php echo $this->url(array('controller'=>'index',
'action'=>'delete', 'id'=>$user->id));?>">Delete</a>
</td>
</tr>
<?php endforeach; ?>
</table>

 

    Teraz je časť aplikácie pre tabuľku users už hotová. Pre tabuľku members je potrebné vytvoriť tiež podobné súbory model, controller a view. Ak je potrebné ošetriť vstupné polia vo formulároch, stačí vytvoriť súbor application/forms/Users.php a uviesť pre každé vstupné pole metódu addValidation, ako môže vidieť v nasledujúcom kóde.


<?php
class Application_Form_User extends Zend_Form
{
public function __construct($options = null)
{
parent::__construct($options);
$this->setName('user');
$id = new Zend_Form_Element_Hidden('id');
$id->addFilter('Int');
$meber_id = new Zend_Form_Element_Text('memeber_id');
$member_id->setLabel('Member')
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator('NotEmpty');
$submit = new Zend_Form_Element_Submit('submit');
$submit->setAttrib('id', 'submitbutton');
$this->addElements(array($id, $member_id, $name, $surname, $phone, $email, $submit));
}}

 

Výsledky namerané pomocou JDepend

 

výsledky JDepend pre Zend Framework

 

výsledky JDepend pre Zend Framework

 

Výsledky z testov pomocou JMeter sú v prehľadnej tabuľke nižšie.

 

 

Udalosť

Vzorky

Priemer [ms]

Stredná hodnota [ms]

Min [ms]

Max [ms]

Priepustnosť

Test č. 1

AddUser

10

2472

2767

1081

3390

24,2/min

Users

10

1255

1525

432

2568

47,6/min

Members

10

724

290

241

2510

1,4/sec

EditUser

10

2103

1974

1072

3014

28,4/min

Celkovo

40

1638

1768

241

3390

36,5/min

Test č. 2

AddUser

10

2768

2602

1270

1399

21,6/min

Users

10

1797

1996

460

3006

33,3/min

Members

10

1044

287

240

2763

57,2/min

EditUser

10

2139

2024

1101

3013

28,0/min

Celkovo

40

1937

1996

240

4399

30,9/min

Test č. 3

AddUser

10

4103

4987

2370

5611

14,6/min

Users

10

2090

2461

480

3011

28,6/min

Members

10

1765

1990

272

3014

33,9/min

EditUser

10

3724

4989

1125

5191

16,1/min

Celkovo

40

2921

2593

272

5611

20,5/min

 

JMeter - graf pre Zend Framework




                             

logo