ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
1. Zend Framework и MVC 27 марта 2010 г. Санкт-Петербург Реализация Модели
2. Докладчик Стешенко Александр Ведущий разработчик компании Norada Более 7-и лет разработки и проектирования программного обеспечения Более 2-х лет использования Zend Framework
9. Zend_Controller_Front Шаблон проектирования Фронт Контроллер (Front Controller) Является так называемым «Одиночкой» (Singleton) Централизованная точка входа для всех запросов Делегирование запроса к специализированному обработчику (Zend_Controller_Action)
11. Диспетчеризация Zend_Controller_Front координирует весь процесс жизни приложения Объект запроса (Request) - POST, GET, SESSION, COOKIES Маршрутизатор (Router) Диспетчер (Dispatcher) Объект ответа (Response) - буферизация вывода
12. Zend_Controller_Action Абстрактный класс для реализации MVC в Zend Framework Наследование Zend_Controller_Actionклассами - контроллерами Класс – контроллер группируетнаборы обработчиков в виде публичных методов – действий.
14. 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'); }
15. Скрипт вида guest-book.php Файл ../application/views/scripts/guest-book.php <html> <head> <title>Comments</title> </head> <body> <div>Comments:</div> <?phpforeach($this->comments as $comment): ?> <div class = "comment"> <?phpecho $this->trim($comment); ?> </div> <?phpendforeach; ?> </body> </html>
18. доступ к МоделиФайл ../application/views/helpers/Trim.php <?php class My_View_Helper_Trim { public function trim($value) { return trim($value); } }
23. Zend_Model… ? Zend Framework предоставляет набор вспомогательных компонент для реализации модели Модель – результат процесса моделирования прикладной системы
27. «Тонкая» модель Файл ../application/models/GuestBook.php <?php class GuestBookextends Zend_Db_Table_Abstract { protected $_name = "comments"; }
28. «Толстый» контроллер class CommentsControllerextends 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; } }
29. «Толстая» модель Файл ../application/models/GuestBook.php <?php class GuestBook { protected $dbTableGateway; public function getVisibleCommentsByPostId() { } public function getHiddenCommentsByPostId() { } }
30. «Тонкий» контроллер 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; }
33. Доменная модель Слой инкапсулирующий объекты бизнес логики и взаимодействие между ними Отделяет бизнес логику системы от доступа к данным и сервисного слоя
34. Пользователь (User) Файл ../application/models/User.php <?php class User { protected $_name; protected $_comments; public function isAdmin(){/*[...]*/} public function authenticate(){/*[...]*/} public function getName(){/*[...]*/} public function getComments(){/*[...]*/} }
35. Комментарий (Comment) Файл ../application/models/Comment.php <?php class Comment { protected $_text; /** * Returns comment’s author * * @return User */ public function getAuthor() { return $this->_user; } }
38. 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); }
39. Zend_Db_Table <?php class UsersGatewayextends Zend_Db_Table_Abstract { protected $_name = 'users'; public function findAllByAddress($address) { $where = $this->getAdapter() ->quoteInto('adress = ?', $address); $rows = $this->fetchAll($where); return $rows; } }
40. Active Record / ORM // Добавление нового пользователя $user = new User($userData); $user->save(); // Обновление данных $user->setName($newUserName); $user->save(); // Удаление записи о пользователе $user->delete(); // Чтение данных $users = $userFinder->findAllByAddress($address); // или $users = User::findAllByAddress($address);
41. Zend ORM class 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);
42. Data Mapper // Добавление нового пользователя $user = new User($userData); $usersMapper->save($user); // Обновление данных $user->setName($newUserName); $usersMapper->save($user); // Удаление записи о пользователе $usersMapper->delete($user); // Чтение данных $users = $usersMapper->findAllByAddress($address);
43. 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; }
44. Data Mapper Добавление объекта public function insert(User $user) { $data = array( 'name' => $user->getName(), 'address' => $user->getAddress() ); $this->_db->insert('users', $data); }