![Page 1: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/1.jpg)
Zend Framework и MVCРеализация Модели
27 марта 2010 г.Санкт-Петербург
![Page 2: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/2.jpg)
Докладчик
Стешенко Александр• Ведущий разработчик компании Norada• Более 7-и лет разработки и проектирования
программного обеспечения• Более 2-х лет использования Zend Framework
![Page 3: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/3.jpg)
Содержание доклада
• Что такое MVC?• MVC в Zend Framework• Реализация модели
![Page 4: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/4.jpg)
Что такое MVC?
![Page 5: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/5.jpg)
Model View Controller
• Модель (Model)- отвечает за данные и поведение бизнес логики приложения
• Представление (View)- отвечает за логику связанную с отображением информации
• Контроллер (Controller)- обрабатывает пользовательский ввод- оперирует моделью для изменения её состояния и
получения необходимых данных- передает данные представлению
![Page 6: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/6.jpg)
Схема отношений в MVC
Модель
Представление
Контроллер
![Page 7: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/7.jpg)
MVC в Zend Framework
![Page 8: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/8.jpg)
Zend_Controller_Front
• Шаблон проектирования Фронт Контроллер (Front Controller)
• Является так называемым «Одиночкой» (Singleton)
• Централизованная точка входа для всех запросов
• Делегирование запроса к специализированному обработчику (Zend_Controller_Action)
![Page 9: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/9.jpg)
Инициализация приложения
Файл /public/index.php
<?php
Zend_Controller_Front::run('../application/controllers');
![Page 10: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/10.jpg)
Диспетчеризация
• Zend_Controller_Front координирует весь процесс жизни приложения
• Объект запроса (Request)- POST, GET, SESSION, COOKIES
• Маршрутизатор (Router)• Диспетчер (Dispatcher)• Объект ответа (Response)
- буферизация вывода
![Page 11: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/11.jpg)
Zend_Controller_Action
• Абстрактный класс для реализации MVC в Zend Framework
• Наследование Zend_Controller_Action классами - контроллерами
• Класс – контроллер группирует наборы обработчиков в виде публичных методов – действий.
![Page 12: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/12.jpg)
Zend_Controller_ActionФайл ../application/controllers/GuestBookController.php
<?phpclass GuestBookController extends Zend_Controller_Action{ public function listCommentsAction() { //[...] } public function addCommentAction() { //[...] }}
![Page 13: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/13.jpg)
Zend_View• Реализация Представления в Zend Framework• Интерпретация «скриптов вида»• Поддержка любых обработчиков шаблонов
public function listAction(){ $guestBookModel = new GuestBook(); $comments = $guestBookModel->getComments(); $view = new Zend_View(); $view->comments = $comments; echo $view->render('guest-book.php');}
![Page 14: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/14.jpg)
Скрипт вида guest-book.phpФайл ../application/views/scripts/guest-book.php
<html> <head> <title>Comments</title> </head> <body> <div>Comments:</div> <?php foreach($this->comments as $comment): ?> <div class = "comment"> <?php echo $this->trim($comment); ?> </div> <?php endforeach; ?> </body></html>
![Page 15: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/15.jpg)
Помощники вида• Механизм для расширения функциональности Вида
- повторяемая логика представления- форматированние данных- доступ к Модели
Файл ../application/views/helpers/Trim.php<?phpclass My_View_Helper_Trim{ public function trim($value) { return trim($value); }}
![Page 16: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/16.jpg)
Помощник действия ViewRenderer
• Помощники действия:- Способ расширить функциональность контроллеров- Перехватчики событий
• Автоматизация настройки объекта Вида• Автоматизация рендеринга шаблонов
![Page 17: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/17.jpg)
Помощник действия ViewRenderer
Файл ../application/controllers/GuestBookController.phpclass GuestBookController extends Zend_Controller_Action{ public function listComments() { $guestBookModel = new GuestBook(); $comments = $guestBookModel->getComments(); $this->view->comments = $comments; } }
Файл ../application/views/scripts/guest-book/list.phtml<?php foreach ($this->comments as $comment): ?> <div class=“comment”><?php echo $comment ?></div><?php endforeach; ?>
![Page 18: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/18.jpg)
Модель
![Page 19: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/19.jpg)
Zend_Model… ?
• Zend Framework предоставляет набор вспомогательных компонент для реализации модели
• Модель – результат процесса моделирования прикладной системы
![Page 20: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/20.jpg)
«Тонкая» модель
• Контроллер выполняет все функции модели- бизнес логика- чтение и запись данных- проверка входящей информации
• Роль модели заключается в доступе к данным
![Page 21: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/21.jpg)
«Тонкая» модель
Файл ../application/models/GuestBook.php
<?php class GuestBook extends Zend_Db_Table_Abstract{ protected $_name = "comments";}
![Page 22: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/22.jpg)
«Толстый» контроллерclass CommentsController extends Zend_Controller_Action{ public function listComments() { $postId = $this->_request->getParam("postid"); $isUser = $this->_request->getCookie("user"); $guestBook = new GuestBook(); $rows = $guestBook->fetchAll("post_id = ?", $postId); $commentsNumber = count($rows); $comments = array(); $hiddenComments = array(); foreach($rows as $row) { if ($row["visible"] == 1) { $comments[] = $row["text"]; } else { if ($isUser) { $hiddenComments[] = $row["text"]; } } } $this->view->comments = $comments; $this->view->hiddenComments = $hiddenComments; }}
![Page 23: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/23.jpg)
«Толстая» модель
Файл ../application/models/GuestBook.php
<?php class GuestBook{ protected $dbTableGateway;
public function getVisibleCommentsByPostId() { }
public function getHiddenCommentsByPostId() { }}
![Page 24: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/24.jpg)
«Тонкий» контроллерpublic function listComments(){ $postId = $this->_request->getParam("post"); $isUser = $this->_request->getCookie("user");
$guestBook = new GuestBook(); $comments = $guestBook ->getVisibleCommentsByPostId($postId, $isUser); $hiddenComments = $guestBook ->getHiddenCommentsByPostId($postId, $isUser);
$this->view->comments = $comments; $this->view->hiddenComments = $hiddenComments;}
![Page 25: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/25.jpg)
Слои (Layers)
Сервисный
слой
Данные
![Page 26: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/26.jpg)
Сервисный слой
• Шаблон проектирования Фасад• Скрывает реализацию объектов бизнес
логики и их взаимодействие- Валидация пользовательского ввода- Авторизация и проверка прав доступа
![Page 27: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/27.jpg)
GuestBookServiceФайл ../application/models/GuestBookService.php
<?phpclass GuestBookService{ //[...] public function addComment($commentData) { $validator = $this->getCommentValidator(); if ($validator->isValid($commentData)) { $this->getCommentTable()->insert($commentData);
} }}
![Page 28: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/28.jpg)
Доменная модель
• Слой инкапсулирующий объекты бизнес логики и взаимодействие между ними
• Отделяет бизнес логику системы от доступа к данным и сервисного слоя
![Page 29: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/29.jpg)
Пользователь (User)Файл ../application/models/User.php
<?phpclass User{ protected $_name; protected $_comments; public function isAdmin(){/*[...]*/} public function authenticate(){/*[...]*/} public function getName(){/*[...]*/} public function getComments(){/*[...]*/}}
![Page 30: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/30.jpg)
Комментарий (Comment)Файл ../application/models/Comment.php
<?phpclass Comment{ protected $_text; /** * Returns comment’s author * * @return User */ public function getAuthor() { return $this->_user; }}
![Page 31: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/31.jpg)
Слой доступа к данным
• Реляционные базы данных- Zend_Db
• Файловая система • Веб сервисы
- Zend_Feed- Zend_Service
• Кеш- Zend_Cache
![Page 32: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/32.jpg)
Table Data Gateway<?php$usersGateway = new UsersGateway();// Добавление нового пользователя$usersGateway->insert($userData);// Обновление данных пользователя$usersGateway->update($userId, $userData);// Удаление пользователя$usersGateway->delete($userId);// Чтение данных$rows = $usersGateway->findAllByAddress($address);// Преобразование в доменные объекты$users = array();foreach ($rows as $row) { $users[] = new User($row);}
![Page 33: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/33.jpg)
Zend_Db_Table<?php class UsersGateway extends Zend_Db_Table_Abstract{ protected $_name = 'users';
public function findAllByAddress($address) { $where = $this->getAdapter() ->quoteInto('adress = ?',
$address); $rows = $this->fetchAll($where); return $rows; }}
![Page 34: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/34.jpg)
Active Record / ORM// Добавление нового пользователя$user = new User($userData);$user->save();// Обновление данных$user->setName($newUserName);$user->save();// Удаление записи о пользователе$user->delete();
// Чтение данных$users = $userFinder->findAllByAddress($address);// или$users = User::findAllByAddress($address);
![Page 35: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/35.jpg)
Zend ORMclass User extends Zend_Db_Table_Row_Abstract{ public function authorize(){/*[...]*/}}
class Users extends Zend_Db_Table_Abstract{ protected $_name = 'users'; protected $_rowClass = 'User'; public function findAllByAddress($address){/*[...]*/}}
$users = new Users;$user = $users->findAllByAddress($address);
![Page 36: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/36.jpg)
Data Mapper
// Добавление нового пользователя$user = new User($userData);$usersMapper->save($user);// Обновление данных$user->setName($newUserName);$usersMapper->save($user);// Удаление записи о пользователе$usersMapper->delete($user);
// Чтение данных$users = $usersMapper-
>findAllByAddress($address);
![Page 37: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/37.jpg)
Data Mapper Поиск объекта по параметру
class UsersMapper{ protected $_db; public function findAllByAddress($address) { $rows = $this->_db->fetchAll( 'Select * From users Where address = ?',
array($address)); $users = array(); foreach ($rows as $row) { $user = new User(); $user->setName($row); $user->setAddress($address); $users[] = $user; } return $users; }
![Page 38: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/38.jpg)
Data Mapper Добавление объекта
public function insert(User $user) { $data = array( 'name' => $user->getName(), 'address' => $user->getAddress() ); $this->_db->insert('users', $data); }
![Page 39: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/39.jpg)
Преимущества Data Mapper
• Доменные объекты инкапсулируют только бизнес логику и не зависят от реализации их хранения- преимущества ORM без зависимости от
реляционных баз данных• Наилучшее разбиение на слои
- рефакторинг- при изменении одной компоненты, остальные не
изменяются- тестирование
![Page 40: ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)](https://reader035.vdocuments.site/reader035/viewer/2022062303/55846d30d8b42ae03e8b52aa/html5/thumbnails/40.jpg)
Реализация Data Mapper
• Zend_Entity… ?• Doctrine 2• phpDataMapper ORM