Zend Framework и MVC<br />27 марта 2010 г.<br />Санкт-Петербург<br />Реализация Модели<br />
Докладчик<br />Стешенко Александр<br />Ведущий разработчик компании Norada<br />Более 7-и лет разработки и проектирования ...
Содержание доклада<br />Что такое MVC?<br />MVC в Zend Framework<br />Реализация модели<br />
Что такое MVC?<br />
Model View Controller<br />Модель (Model)<br /><ul><li>отвечает за данные и поведение бизнес логики приложения</li></ul>Пр...
оперирует моделью для изменения её состояния и получения необходимых данных
передает данные представлению</li></li></ul><li>Схема отношений в MVC<br />
MVC в Zend Framework<br />
Zend_Controller_Front<br />Шаблон проектирования Фронт Контроллер (Front Controller)<br />Является так называемым «Одиночк...
Инициализация приложения<br />Файл /public/index.php<br /><?php<br />Zend_Controller_Front::run('../application/controller...
Диспетчеризация<br />Zend_Controller_Front координирует весь процесс жизни приложения<br />Объект запроса (Request)<br />-...
Zend_Controller_Action<br />Абстрактный класс для реализации MVC в Zend Framework<br />Наследование Zend_Controller_Action...
Zend_Controller_Action<br />Файл ../application/controllers/GuestBookController.php<br /><?php<br />class GuestBookControl...
Zend_View<br />Реализация Представления в Zend Framework<br />Интерпретация «скриптов вида»<br />Поддержка любых обработчи...
Скрипт вида guest-book.php<br />Файл ../application/views/scripts/guest-book.php<br /><html><br /><head><br /><title>Comme...
Помощники вида<br />Механизм для расширения функциональности Вида<br /><ul><li>повторяемая логика представления
форматированние данных
доступ к Модели</li></ul>Файл ../application/views/helpers/Trim.php<br /><?php<br />class My_View_Helper_Trim<br />{<br />...
Помощник действия ViewRenderer<br />Помощники действия:<br /><ul><li>Способ расширить функциональность контроллеров
Перехватчики событий</li></ul>Автоматизация настройки объекта Вида<br />Автоматизация рендеринга шаблонов<br />
Помощник действия ViewRenderer<br />Файл ../application/controllers/GuestBookController.php<br />class GuestBookController...
Модель<br />
Zend_Model… ?<br />Zend Framework предоставляет набор вспомогательных компонент для реализации модели<br />Модель – резуль...
«Тонкая» модель<br />Контроллер выполняет все функции модели<br /><ul><li>бизнес логика
чтение и запись данных
проверка входящей информации</li></ul>Роль модели заключается в доступе к данным<br />
«Тонкая» модель<br />Файл ../application/models/GuestBook.php<br /><?php<br />class GuestBookextends Zend_Db_Table_Abstrac...
«Толстый» контроллер<br />class CommentsControllerextends Zend_Controller_Action<br />{<br />public function listComments(...
«Толстая» модель<br />Файл ../application/models/GuestBook.php<br /><?php<br />class GuestBook<br />{<br />protected $dbTa...
«Тонкий» контроллер<br />public function listComments()<br />{<br />$postId= $this->_request->getParam("post");<br />$isUs...
Слои (Layers)<br />
Сервисный слой<br />Шаблон проектирования Фасад<br />Скрывает реализацию объектов бизнес логики и их взаимодействие<br />-...
Доменная модель<br />Слой инкапсулирующий объекты бизнес логики и взаимодействие между ними<br />Отделяет бизнес логику си...
Пользователь (User)<br />Файл ../application/models/User.php<br /><?php<br />class User<br />{<br />protected $_name;<br /...
Комментарий (Comment)<br />Файл ../application/models/Comment.php<br /><?php<br />class Comment<br />{<br />protected $_te...
Слой доступа к данным<br />Реляционные базы данных<br /><ul><li>Zend_Db</li></ul>Файловая система <br />Веб сервисы<br /><...
Zend_Service</li></ul>Кеш<br />- Zend_Cache<br />
Table Data Gateway<br /><?php<br />$usersGateway= new UsersGateway();<br />// Добавление нового пользователя<br />$usersGa...
Zend_Db_Table<br /><?php<br />class UsersGatewayextends Zend_Db_Table_Abstract<br />{<br />protected $_name = 'users';<br ...
Active Record / ORM<br />// Добавление нового пользователя<br />$user = new User($userData);<br />$user->save();<br />// О...
Upcoming SlideShare
Loading in...5
×

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

58,727

Published on

0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
58,727
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
134
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

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 />
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×