Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)

59,297 views

Published on

  • Be the first to comment

ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)

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

×