SlideShare a Scribd company logo
Zend Framework и MVC27 марта 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<?phpZend_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<?phpclass 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<?phpclass My_View_Helper_Trim{public function trim($value)    {return trim($value);    }}
Помощник действия ViewRendererПомощники действия:Способ расширить функциональность контроллеров
Перехватчики событийАвтоматизация настройки объекта ВидаАвтоматизация рендеринга шаблонов
Помощник действия ViewRendererФайл ../application/controllers/GuestBookController.phpclass 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<?phpclass 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<?phpclass 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<?phpclass GuestBookService{//[...]public function addComment($commentData)    {$validator= $this->getCommentValidator();if ($validator->isValid($commentData)) {$this->getCommentTable()->insert($commentData);           }    }}
Доменная модельСлой инкапсулирующий объекты бизнес логики и взаимодействие между нимиОтделяет бизнес логику системы от доступа к данным и сервисного слоя
Пользователь (User)Файл ../application/models/User.php<?phpclass User{protected $_name;protected $_comments;public function isAdmin(){/*[...]*/}public function authenticate(){/*[...]*/}public function getName(){/*[...]*/}public function getComments(){/*[...]*/}}
Комментарий (Comment)Файл ../application/models/Comment.php<?phpclass 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<?phpclass 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);

More Related Content

PPTX
Индексирование в Magento
PPTX
Все дороги ведут в Checkout
PPTX
Yii2
PDF
Ф'Yii'лософия
PPTX
Реализация шаблонов корпоративных приложений в Magento
PPT
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
PPT
Ubercart -nemnogo_primerov_iz_zhizni
PPT
Form api в drupal 7
Индексирование в Magento
Все дороги ведут в Checkout
Yii2
Ф'Yii'лософия
Реализация шаблонов корпоративных приложений в Magento
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
Ubercart -nemnogo_primerov_iz_zhizni
Form api в drupal 7

What's hot (20)

PPTX
course js day 4
PDF
Продвинутое использование ActiveRecord в Yii2
PPT
Общая архитектура Yii2
PDF
Денис Чистяков: DOM, jQuery и все, все, все
PDF
Making Scalable JavaScript Application
PPT
Javascript
PPT
Подробная презентация JavaScript 6 в 1
PDF
Rambler.iOS #8: Как не стать жертвой бэкендеров
PPTX
Render API.
PDF
10 - Web-технологии. MVC фреймворки (продолжение)
PPT
Подробная презентация JavaScript 6 в 1
PDF
Crazy owl yii1=> yii2
PDF
Использование API Яндекс.Карт
PPTX
Сущности в Drupal 7
PDF
"Жизнь без интернета" Кувалдин Артём, Яндекс
PDF
YiiConf: Миграции и инсталляции
PPT
Импорт данных с фреймворком Migrate. Владислав Богатырев.
PDF
Примеры решения типичных задач за рамками ядра Yii2
PDF
QA Fest 2019. Андрей Солнцев. Selenide для профи
course js day 4
Продвинутое использование ActiveRecord в Yii2
Общая архитектура Yii2
Денис Чистяков: DOM, jQuery и все, все, все
Making Scalable JavaScript Application
Javascript
Подробная презентация JavaScript 6 в 1
Rambler.iOS #8: Как не стать жертвой бэкендеров
Render API.
10 - Web-технологии. MVC фреймворки (продолжение)
Подробная презентация JavaScript 6 в 1
Crazy owl yii1=> yii2
Использование API Яндекс.Карт
Сущности в Drupal 7
"Жизнь без интернета" Кувалдин Артём, Яндекс
YiiConf: Миграции и инсталляции
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Примеры решения типичных задач за рамками ядра Yii2
QA Fest 2019. Андрей Солнцев. Selenide для профи
Ad

Viewers also liked (20)

PPT
ParaEmpezarSeasonsandWeather
PPT
Lone Star College Tomball Community Library
DOC
Sport Equipment Ukr
PDF
Moshnyaga The Use Of Eye Tracking For Pc Energy Management
DOCX
Sana samad evaluation- reflection journal
PPT
Web 2 0
PPT
Peñaranda
PDF
Morimoto Context Switching For Fast Key Selection In Text Entry Applications
RTF
PPTX
DIY Handout: Victoria L. Martinez
PDF
השגת רציפות טריטוריאלית במלחמת העצמאות
PPT
Testcase
DOC
XNA coding series
PDF
Fundamentos da educação especial inclusiva
DOC
testeeeestes
PPT
Inlichtingenfunctie Presentatie 17 3 2010
PDF
Blignaut Visual Span And Other Parameters For The Generation Of Heatmaps
PDF
India Horizontal Plant
ParaEmpezarSeasonsandWeather
Lone Star College Tomball Community Library
Sport Equipment Ukr
Moshnyaga The Use Of Eye Tracking For Pc Energy Management
Sana samad evaluation- reflection journal
Web 2 0
Peñaranda
Morimoto Context Switching For Fast Key Selection In Text Entry Applications
DIY Handout: Victoria L. Martinez
השגת רציפות טריטוריאלית במלחמת העצמאות
Testcase
XNA coding series
Fundamentos da educação especial inclusiva
testeeeestes
Inlichtingenfunctie Presentatie 17 3 2010
Blignaut Visual Span And Other Parameters For The Generation Of Heatmaps
India Horizontal Plant
Ad

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

PPT
Yserver
PPT
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ODP
ZFConf 2010: Zend Framework and Doctrine
PPT
Интеграция Яндекс Сервер
PPTX
PDF
MyBatis на практике
PDF
Symfony2. На чем можно сэкономить время при разработке?
PDF
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
PDF
Yii: миграции и инсталляции
PDF
MVVM в WinForms – DevExpress Way (теория и практика)
PDF
Knockoutjs на примере 2ГИС-Онлайн
PDF
Zend Framework и Doctrine
PDF
Почему Mojolicious?
PDF
Пластилиновый код: как перестать кодить и начать жить
PDF
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
PDF
UWDC 2013, Yii2
PDF
Looking into WordPress Core, WordCamp Russia 2015
PDF
Страх и ненависть в исходном коде
PDF
Zend framework 2
Yserver
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: Zend Framework and Doctrine
Интеграция Яндекс Сервер
MyBatis на практике
Symfony2. На чем можно сэкономить время при разработке?
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Yii: миграции и инсталляции
MVVM в WinForms – DevExpress Way (теория и практика)
Knockoutjs на примере 2ГИС-Онлайн
Zend Framework и Doctrine
Почему Mojolicious?
Пластилиновый код: как перестать кодить и начать жить
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
UWDC 2013, Yii2
Looking into WordPress Core, WordCamp Russia 2015
Страх и ненависть в исходном коде
Zend framework 2

More from ZFConf Conference (20)

PPTX
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
PPT
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
PDF
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
PDF
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
PPTX
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
PDF
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
PDF
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ODP
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
PPT
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
PPTX
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
PPTX
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
PPT
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
PDF
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
PPT
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
PPT
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
PPT
ZFConf 2010: History of e-Shtab.ru
PPTX
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
PPT
ZFConf 2010: Performance of Zend Framework Applications
PPT
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
PPT
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2010: History of e-Shtab.ru
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)

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