Zend Framework - vytvorenie a testovanie jednoduchej aplikácie
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> </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 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 |