SlideShare a Scribd company logo
1 of 40
Zend Framework и MVC 27 марта 2010 г. Санкт-Петербург Реализация Модели
Докладчик Стешенко Александр Ведущий разработчик компании Norada Более 7-и лет разработки и проектирования программного обеспечения Более 2-х лет использования Zend Framework
Содержание доклада Что такое MVC? MVC в Zend Framework Реализация модели
Что такое MVC?
Model View Controller Модель (Model) ,[object Object],Представление (View) - отвечает за логику связанную с отображением информации Контроллер (Controller) ,[object Object]
оперирует моделью для изменения её состояния и получения необходимых данных
передает данные представлению,[object Object]
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>
Помощники вида Механизм для расширения функциональности Вида ,[object Object]
форматированние данных
доступ к МоделиФайл ../application/views/helpers/Trim.php <?php class My_View_Helper_Trim { public function trim($value)     { return trim($value);     } }
Помощник действия ViewRenderer Помощники действия: ,[object Object]
Перехватчики событийАвтоматизация настройки объекта Вида Автоматизация рендеринга шаблонов
Помощник действия 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 предоставляет набор вспомогательных компонент для реализации модели Модель – результат процесса моделирования прикладной системы
«Тонкая» модель Контроллер выполняет все функции модели ,[object Object]
чтение и запись данных
проверка входящей информацииРоль модели заключается в доступе к данным
«Тонкая» модель Файл ../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)
Сервисный слой Шаблон проектирования Фасад Скрывает реализацию объектов бизнес логики и их взаимодействие -  Валидация пользовательского ввода ,[object Object],[object Object]
Доменная модель Слой инкапсулирующий объекты бизнес логики и взаимодействие между ними Отделяет бизнес логику системы от доступа к данным и сервисного слоя
Пользователь (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;     } }
Слой доступа к данным Реляционные базы данных ,[object Object],Файловая система  Веб сервисы ,[object Object]
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);

More Related Content

What's hot

Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Paul Klimov
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2Paul Klimov
 
Денис Чистяков: DOM, jQuery и все, все, все
Денис Чистяков: DOM, jQuery и все, все, всеДенис Чистяков: DOM, jQuery и все, все, все
Денис Чистяков: DOM, jQuery и все, все, всеYandex
 
Making Scalable JavaScript Application
Making Scalable JavaScript ApplicationMaking Scalable JavaScript Application
Making Scalable JavaScript ApplicationMikhail Davydov
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Rambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеровRambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеровRAMBLER&Co
 
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)Roman Brovko
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Использование API Яндекс.Карт
Использование API Яндекс.КартИспользование API Яндекс.Карт
Использование API Яндекс.КартFDConf
 
Сущности в Drupal 7
Сущности в Drupal 7Сущности в Drupal 7
Сущности в Drupal 7Itech4Web
 
"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндексit-people
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииPaul Klimov
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.DrupalCampDN
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Paul Klimov
 
QA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профиQA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профиQAFest
 

What's hot (20)

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

Viewers also liked

ParaEmpezarSeasonsandWeather
ParaEmpezarSeasonsandWeatherParaEmpezarSeasonsandWeather
ParaEmpezarSeasonsandWeatherSenoraAmandaWhite
 
Lone Star College Tomball Community Library
Lone Star College Tomball Community LibraryLone Star College Tomball Community Library
Lone Star College Tomball Community Libraryguest54f40230
 
Moshnyaga The Use Of Eye Tracking For Pc Energy Management
Moshnyaga The Use Of Eye Tracking For Pc Energy ManagementMoshnyaga The Use Of Eye Tracking For Pc Energy Management
Moshnyaga The Use Of Eye Tracking For Pc Energy ManagementKalle
 
Sana samad evaluation- reflection journal
Sana samad evaluation- reflection journalSana samad evaluation- reflection journal
Sana samad evaluation- reflection journalSana Samad
 
Morimoto Context Switching For Fast Key Selection In Text Entry Applications
Morimoto Context Switching For Fast Key Selection In Text Entry ApplicationsMorimoto Context Switching For Fast Key Selection In Text Entry Applications
Morimoto Context Switching For Fast Key Selection In Text Entry ApplicationsKalle
 
DIY Handout: Victoria L. Martinez
DIY Handout: Victoria L. MartinezDIY Handout: Victoria L. Martinez
DIY Handout: Victoria L. MartinezBobby Raleigh
 
השגת רציפות טריטוריאלית במלחמת העצמאות
השגת רציפות טריטוריאלית במלחמת העצמאותהשגת רציפות טריטוריאלית במלחמת העצמאות
השגת רציפות טריטוריאלית במלחמת העצמאותhaimkarel
 
Fundamentos da educação especial inclusiva
Fundamentos da educação especial inclusivaFundamentos da educação especial inclusiva
Fundamentos da educação especial inclusivaGeisse Martins
 
Inlichtingenfunctie Presentatie 17 3 2010
Inlichtingenfunctie Presentatie 17 3 2010Inlichtingenfunctie Presentatie 17 3 2010
Inlichtingenfunctie Presentatie 17 3 2010BertilVoogd
 
Blignaut Visual Span And Other Parameters For The Generation Of Heatmaps
Blignaut Visual Span And Other Parameters For The Generation Of HeatmapsBlignaut Visual Span And Other Parameters For The Generation Of Heatmaps
Blignaut Visual Span And Other Parameters For The Generation Of HeatmapsKalle
 

Viewers also liked (20)

ParaEmpezarSeasonsandWeather
ParaEmpezarSeasonsandWeatherParaEmpezarSeasonsandWeather
ParaEmpezarSeasonsandWeather
 
Lone Star College Tomball Community Library
Lone Star College Tomball Community LibraryLone Star College Tomball Community Library
Lone Star College Tomball Community Library
 
Test
TestTest
Test
 
Sport Equipment Ukr
Sport Equipment UkrSport Equipment Ukr
Sport Equipment Ukr
 
Moshnyaga The Use Of Eye Tracking For Pc Energy Management
Moshnyaga The Use Of Eye Tracking For Pc Energy ManagementMoshnyaga The Use Of Eye Tracking For Pc Energy Management
Moshnyaga The Use Of Eye Tracking For Pc Energy Management
 
Sana samad evaluation- reflection journal
Sana samad evaluation- reflection journalSana samad evaluation- reflection journal
Sana samad evaluation- reflection journal
 
Web 2 0
Web 2 0Web 2 0
Web 2 0
 
Peñaranda
PeñarandaPeñaranda
Peñaranda
 
Morimoto Context Switching For Fast Key Selection In Text Entry Applications
Morimoto Context Switching For Fast Key Selection In Text Entry ApplicationsMorimoto Context Switching For Fast Key Selection In Text Entry Applications
Morimoto Context Switching For Fast Key Selection In Text Entry Applications
 
Cd covers
Cd coversCd covers
Cd covers
 
DIY Handout: Victoria L. Martinez
DIY Handout: Victoria L. MartinezDIY Handout: Victoria L. Martinez
DIY Handout: Victoria L. Martinez
 
เศรษฐกิจ
เศรษฐกิจเศรษฐกิจ
เศรษฐกิจ
 
השגת רציפות טריטוריאלית במלחמת העצמאות
השגת רציפות טריטוריאלית במלחמת העצמאותהשגת רציפות טריטוריאלית במלחמת העצמאות
השגת רציפות טריטוריאלית במלחמת העצמאות
 
Testcase
TestcaseTestcase
Testcase
 
XNA coding series
XNA coding seriesXNA coding series
XNA coding series
 
Fundamentos da educação especial inclusiva
Fundamentos da educação especial inclusivaFundamentos da educação especial inclusiva
Fundamentos da educação especial inclusiva
 
testeeeestes
testeeeestestesteeeestes
testeeeestes
 
Inlichtingenfunctie Presentatie 17 3 2010
Inlichtingenfunctie Presentatie 17 3 2010Inlichtingenfunctie Presentatie 17 3 2010
Inlichtingenfunctie Presentatie 17 3 2010
 
Blignaut Visual Span And Other Parameters For The Generation Of Heatmaps
Blignaut Visual Span And Other Parameters For The Generation Of HeatmapsBlignaut Visual Span And Other Parameters For The Generation Of Heatmaps
Blignaut Visual Span And Other Parameters For The Generation Of Heatmaps
 
India Horizontal Plant
India Horizontal PlantIndia Horizontal Plant
India Horizontal Plant
 

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

ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf Conference
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf Conference
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс СерверPVasili
 
MyBatis на практике
MyBatis на практикеMyBatis на практике
MyBatis на практикеVitebsk Miniq
 
Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?Stepan Tanasiychuk
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Dev_Party
 
Yii: миграции и инсталляции
Yii: миграции и инсталляцииYii: миграции и инсталляции
Yii: миграции и инсталляцииPaul Klimov
 
MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)GoSharp
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн2ГИС Технологии
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
 
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020OdessaJS Conf
 
Looking into WordPress Core, WordCamp Russia 2015
Looking into WordPress Core, WordCamp Russia 2015Looking into WordPress Core, WordCamp Russia 2015
Looking into WordPress Core, WordCamp Russia 2015Sergey Biryukov
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном кодеKolya Korobochkin
 

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

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

More from ZFConf Conference

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

More from ZFConf Conference (20)

ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
 
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
 
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
 
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
 
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
 
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
 
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
 
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
 
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
 
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
 
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
 
ZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ruZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ru
 
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend FrameworkZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
 
ZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework ApplicationsZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework Applications
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
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: Using Message Queues in Day-to-Day Projects (Zend_Queue)ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
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
  • 3. Содержание доклада Что такое MVC? MVC в Zend Framework Реализация модели
  • 5.
  • 6. оперирует моделью для изменения её состояния и получения необходимых данных
  • 7.
  • 8. MVC в Zend Framework
  • 9. Zend_Controller_Front Шаблон проектирования Фронт Контроллер (Front Controller) Является так называемым «Одиночкой» (Singleton) Централизованная точка входа для всех запросов Делегирование запроса к специализированному обработчику (Zend_Controller_Action)
  • 10. Инициализация приложения Файл /public/index.php <?php Zend_Controller_Front::run('../application/controllers');
  • 11. Диспетчеризация Zend_Controller_Front координирует весь процесс жизни приложения Объект запроса (Request) - POST, GET, SESSION, COOKIES Маршрутизатор (Router) Диспетчер (Dispatcher) Объект ответа (Response) - буферизация вывода
  • 12. Zend_Controller_Action Абстрактный класс для реализации MVC в Zend Framework Наследование Zend_Controller_Actionклассами - контроллерами Класс – контроллер группируетнаборы обработчиков в виде публичных методов – действий.
  • 13. Zend_Controller_Action Файл ../application/controllers/GuestBookController.php <?php class GuestBookControllerextends Zend_Controller_Action { public function listCommentsAction() { //[...] } public function addCommentAction() { //[...] } }
  • 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>
  • 16.
  • 18. доступ к МоделиФайл ../application/views/helpers/Trim.php <?php class My_View_Helper_Trim { public function trim($value) { return trim($value); } }
  • 19.
  • 20. Перехватчики событийАвтоматизация настройки объекта Вида Автоматизация рендеринга шаблонов
  • 21. Помощник действия 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; ?>
  • 23. Zend_Model… ? Zend Framework предоставляет набор вспомогательных компонент для реализации модели Модель – результат процесса моделирования прикладной системы
  • 24.
  • 26. проверка входящей информацииРоль модели заключается в доступе к данным
  • 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; }
  • 32.
  • 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; } }
  • 36.
  • 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); }
  • 45.
  • 46. при изменении одной компоненты, остальные не изменяются
  • 47.