• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
 

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

on

  • 13,873 views

 

Statistics

Views

Total Views
13,873
Views on SlideShare
10,556
Embed Views
3,317

Actions

Likes
6
Downloads
133
Comments
0

10 Embeds 3,317

http://www.zfconf.ru 2995
http://zendframework.ru 169
http://doriangray.com.ua 77
http://www.slideshare.net 68
http://translate.googleusercontent.com 2
http://xss.yandex.net 2
file:// 1
http://unic.ru 1
http://static.slidesharecdn.com 1
http://blog.avolberg.ru 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • Zend Framework и MVC
      27 марта 2010 г.
      Санкт-Петербург
      Реализация Модели
    • Докладчик
      Стешенко Александр
      Ведущий разработчик компании Norada
      Более 7-и лет разработки и проектирования программного обеспечения
      Более 2-х лет использования Zend Framework
    • Содержание доклада
      Что такое MVC?
      MVC в Zend Framework
      Реализация модели
    • Что такое MVC?
    • Model View Controller
      Модель (Model)
      • отвечает за данные и поведение бизнес логики приложения
      Представление (View)
      - отвечает за логику связанную с отображением информации
      Контроллер (Controller)
      • обрабатывает пользовательский ввод
      • оперирует моделью для изменения её состояния и получения необходимых данных
      • передает данные представлению
    • Схема отношений в MVC
    • MVC в Zend Framework
    • Zend_Controller_Front
      Шаблон проектирования Фронт Контроллер (Front Controller)
      Является так называемым «Одиночкой» (Singleton)
      Централизованная точка входа для всех запросов
      Делегирование запроса к специализированному обработчику (Zend_Controller_Action)
    • Инициализация приложения
      Файл /public/index.php
      <?php
      Zend_Controller_Front::run('../application/controllers');
    • Диспетчеризация
      Zend_Controller_Front координирует весь процесс жизни приложения
      Объект запроса (Request)
      - POST, GET, SESSION, COOKIES
      Маршрутизатор (Router)
      Диспетчер (Dispatcher)
      Объект ответа (Response)
      - буферизация вывода
    • Zend_Controller_Action
      Абстрактный класс для реализации MVC в Zend Framework
      Наследование Zend_Controller_Actionклассами - контроллерами
      Класс – контроллер группируетнаборы обработчиков в виде публичных методов – действий.
    • Zend_Controller_Action
      Файл ../application/controllers/GuestBookController.php
      <?php
      class GuestBookControllerextends Zend_Controller_Action
      {
      public function listCommentsAction()
      {
      //[...]
      }
      public function addCommentAction()
      {
      //[...]
      }
      }
    • 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');
      }
    • Скрипт вида 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>
    • Помощники вида
      Механизм для расширения функциональности Вида
      • повторяемая логика представления
      • форматированние данных
      • доступ к Модели
      Файл ../application/views/helpers/Trim.php
      <?php
      class My_View_Helper_Trim
      {
      public function trim($value)
      {
      return trim($value);
      }
      }
    • Помощник действия ViewRenderer
      Помощники действия:
      • Способ расширить функциональность контроллеров
      • Перехватчики событий
      Автоматизация настройки объекта Вида
      Автоматизация рендеринга шаблонов
    • Помощник действия ViewRenderer
      Файл ../application/controllers/GuestBookController.php
      class GuestBookControllerextends Zend_Controller_Action
      {
      public function listComments()
      {
      $guestBookModel= new GuestBook();
      $comments = $guestBookModel->getComments();
      $this->view->comments = $comments;
      }
      }
      Файл ../application/views/scripts/guest-book/list.phtml
      <?phpforeach($this->comments as $comment): ?>
      <div class=“comment”><?phpecho $comment ?></div>
      <?phpendforeach; ?>
    • Модель
    • Zend_Model… ?
      Zend Framework предоставляет набор вспомогательных компонент для реализации модели
      Модель – результат процесса моделирования прикладной системы
    • «Тонкая» модель
      Контроллер выполняет все функции модели
      • бизнес логика
      • чтение и запись данных
      • проверка входящей информации
      Роль модели заключается в доступе к данным
    • «Тонкая» модель
      Файл ../application/models/GuestBook.php
      <?php
      class GuestBookextends Zend_Db_Table_Abstract
      {
      protected $_name = "comments";
      }
    • «Толстый» контроллер
      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;
      }
      }
    • «Толстая» модель
      Файл ../application/models/GuestBook.php
      <?php
      class GuestBook
      {
      protected $dbTableGateway;
      public function getVisibleCommentsByPostId()
      {
      }
      public function getHiddenCommentsByPostId()
      {
      }
      }
    • «Тонкий» контроллер
      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;
      }
    • Слои (Layers)
    • Сервисный слой
      Шаблон проектирования Фасад
      Скрывает реализацию объектов бизнес логики и их взаимодействие
      - Валидация пользовательского ввода
      • Авторизация и проверка прав доступа
    • GuestBookService
      Файл ../application/models/GuestBookService.php
      <?php
      class GuestBookService
      {
      //[...]
      public function addComment($commentData)
      {
      $validator= $this->getCommentValidator();
      if ($validator->isValid($commentData)) {
      $this->getCommentTable()->insert($commentData);
      }
      }
      }
    • Доменная модель
      Слой инкапсулирующий объекты бизнес логики и взаимодействие между ними
      Отделяет бизнес логику системы от доступа к данным и сервисного слоя
    • Пользователь (User)
      Файл ../application/models/User.php
      <?php
      class User
      {
      protected $_name;
      protected $_comments;
      public function isAdmin(){/*[...]*/}
      public function authenticate(){/*[...]*/}
      public function getName(){/*[...]*/}
      public function getComments(){/*[...]*/}
      }
    • Комментарий (Comment)
      Файл ../application/models/Comment.php
      <?php
      class Comment
      {
      protected $_text;
      /**
      * Returns comment’s author
      *
      * @return User
      */
      public function getAuthor()
      {
      return $this->_user;
      }
      }
    • Слой доступа к данным
      Реляционные базы данных
      • Zend_Db
      Файловая система
      Веб сервисы
      • Zend_Feed
      • Zend_Service
      Кеш
      - Zend_Cache
    • 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);
      }
    • 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;
      }
      }
    • Active Record / ORM
      // Добавление нового пользователя
      $user = new User($userData);
      $user->save();
      // Обновление данных
      $user->setName($newUserName);
      $user->save();
      // Удаление записи о пользователе
      $user->delete();
      // Чтение данных
      $users = $userFinder->findAllByAddress($address);
      // или
      $users = User::findAllByAddress($address);
    • 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);
    • Data Mapper
      // Добавление нового пользователя
      $user = new User($userData);
      $usersMapper->save($user);
      // Обновление данных
      $user->setName($newUserName);
      $usersMapper->save($user);
      // Удаление записи о пользователе
      $usersMapper->delete($user);
      // Чтение данных
      $users = $usersMapper->findAllByAddress($address);
    • 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;
      }
    • Data Mapper Добавление объекта
      public function insert(User $user)
      {
      $data = array(
      'name' => $user->getName(),
      'address' => $user->getAddress()
      );
      $this->_db->insert('users', $data);
      }
    • Преимущества Data Mapper
      Доменные объекты инкапсулируют только бизнес логику и не зависят от реализации их хранения
      • преимущества ORM без зависимости от реляционных баз данных
      Наилучшее разбиение на слои
      • рефакторинг
      • при изменении одной компоненты, остальные не изменяются
      • тестирование
    • Реализация Data Mapper
      Zend_Entity… ?
      Doctrine 2
      phpDataMapper ORM