Слайд 1Обзор PHP-фреймвокров.
Разработка веб-проектов на Zend Framework
Граков Алексей
Antalika.com
Слайд 2Этот доклад был прочитан на конференции Байнет 2.2 Beta. Минск, 11-12
сентября 2008.
официальный сайт: www.bynet2.org
Слайд 3Обычная разработка
Cms 1
Cms 2
Super CMS
Лучшая в мире CMS, потому,
что я написал ее сам!
Зачем что-то еще?
Слайд 5Потребность в фреймворках
Разработка нестандартных проектов.
Желание иметь под рукой хороший инструмент,
который будет:
- развиваться
- иметь хорошую документацию
- иметь качественный код
- обеспечивать достаточную гибкость
- содержать компоненты на все случаи жизни
- бесплатным
Слайд 6Преимущества фреймворков
Один зверь, вместо зоопарка
Ускорение сроков разработки
Меньше внимания на мелочи, больше
на бизнес логику
Больший контроль над процессом и качеством разработки
Хорошая документированность
Быстрый ввод новичков на проект
Слайд 7Php-фреймворки:
codeIgniter
cakePHP
Symfony
Zend Framework
Слайд 8
Цитируемость фреймворков
в поисковиках
Слайд 10CakePHP::Возможности
Совместим с PHP4 и PHP5
MVC
Своя файловая структура
Своя абстракция данных (либо Adodb,
PEAR::Db)
Поддержка плагинов
Валидация
Scaffolding
Маршрутизация запросов
Компоненты / Хелперы / i18n
Слайд 12CakePHP::Соглашения
Класс KissesAndHugsController должен храниться в файле kisses_and_hugs_controller.php
Название модели записывается в ед.
числе: Book, MyBook, и т.п.
Названия таблиц должны быть в множественном числе, и через подчеркивание: my_year_books
Названия множественном числе. BooksController, OxenController.
Слайд 13CakePHP::Контроллеры
index – метод по умолчанию ( site.com/books/ )
Методы контроллера
beforeFilter –
до логики
beforeRender – до view
afterFilter – после логики и после view
Слайд 14CakePHP::Модели
Доступные методы в каждой модели:
beforeFind()
afterFind()
beforeValidate()
beforeSave()
afterSave()
beforeDelete()
afterDelete()
Слайд 15CakePHP::Шаблоны
Чистый PHP
Smarty
Место нахождения шаблона:
/app/views/people/index.tpl
Слайд 16CakePHP::Проекты
Fileshifter.com
Server: Pentium 3, 733mhz, 512MB RAM, 2TB SATA RAID.
OS:
Fedora Linux, ext3 filesystem.
Объем данных на сервере: 1.37 TB.
Ежедневный траффик: 28 GB в среднем.
Время отклика: 0.3-0.5 сек
Слайд 18CodeIgniter
Текущая версия 1.6.3
Гибкость
Плагины / Хелперы
Скаффолдинг
Простота (loose coupling)
MVC
Поддержка PHP4
Настройка параметров автозагрузки
Слайд 20CodeIgniter::модели
Классы моделей хранятся в папке application/models/
Класс: Model_name
Имя файла:
application/models/user_model.php
Загрузка:
$this->load->model('Model_name');
$this->Model_name->function();
Слайд 21CodeIgniter::Контроллеры
application/config/routes.php – маршруты
$route['default_controller'] = ‘XXX_controller';
class My_class extends Controller {
….
}
_remap ()
Слайд 22CodeIgniter::View
class Privet extends Controller
{
….
}
Загрузка:
$this->load->view('name');
Слайд 24Symfony::использует
Creole – абстракция с БД
Propel ( PDO
с 1.2)
Prado для i18n
Spyc YAML парсинг
Pake для командной строки(symfony 1.0)
Prototype, Script.aculo.us, Dynarch.com, TinyMCE
Слайд 25Symfony::возможности
I18n, l10n, cache, валидация и т.п.
Scaffolding
Генерация кода
AdminGenerator
Независимые блоки (Loose
coupling)
Маршрутизация
Хелперы
Debug
Слайд 26Symfony::особенности
Все классы начинаются с ‘sf’ (стандартные)
class ##MODULE_NAME##Actions extends sfActions
Много различного
рода конфигурационных файлов.
Слайд 28Symfony::Известные проекты
bookmarks.yahoo.com (20 млн пользователей)
www.splitgames.fr (сайт обмена играми)
www.kuss.de (сайт знакомств)
www.winkel.ro (доска
объявлений)
Слайд 30Zend Framework (ZF)
Acl (роли и ресурсы)
Auth (openId, Microsoft InfoCard)
Cache / Loader
Config / Console_Getopt (cli)
Date ( i18n, l10N) / Db
Filter, Validate (34) / Gdata (Zend Google Data Client)
Http_Client / Json / Locale, Log, Mail, Mime, Registry
Rest_Client / Rest_Server
Service: Akismet, Amazon, Delicious, Flickr, Nirvanix, Simpy, StrikeIron и Yahoo! / XmlRpc
Слайд 31Новое в ZF 1.6 RC1
Интеграция с Dojo
Поддержка с SOAP
Unit-тесты для контроллеров
Поддержка
индексных файлов Lucene 2.3
Zend_Session – обработчик сохранения
Paginator
Zend_Config_Xml – поддержка атрибутов
Медиа хелперы (QuickTime, Flash)
Слайд 32ZF в цифрах
Более 7 миллионов загрузок
Более 500
разработчиков
Более 1000 страниц в справочнике
Более 500 примеров
Более 60 проектов на SourceForge
Более 30 проектов на Google Code
Около 70 различных компонентов.
Слайд 33ZF::соглашения
Class My_Class_Name должен находится в файле:
My/Class/Name.php
Cтиль кода во многом совпадает
со стилями PEAR
Слайд 36ZF::Модели
Zend_Db_Table
PDO
$db = Zend_Db::factory($cfgDb->type, $params);
Zend_Db_Table::setDefaultAapter($db);
Zend_Registry::set("DB", $db);
Слайд 37ZF::Контроллеры
Zend_Controller_Action
ErrorHandler plugin
ViewRenderer action helper plugin
preDispatch
postDispatch
Init
Слайд 38ZF::View
interface Zend_View_Interface
public function render($name);
public function assign($name);
Zend_View_Abstract
basePath, filters, helpers, _setHelperClass (filter)
Zend/Controller/Action/Helper/ViewRenderer .php
MyClass_View_Smarty
extends Zend_View_Abstract
Слайд 39ZF::Проекты
www.magentocommerce.com – движок для e-commerce, 0.5млн скачиваний, 30K users, 70 партнеров,
60+ языков, 150+ расширений (no java!)
RightMedia – online реклама (NY)
4-5млрд показов в день, 100K запросов/с, 19K рекламодателей и партнеров (5 dev-6m)
QEDWiki – IBM (mashups)
PokerRoom.com – 12млн users (25 srv, 16front, 9mysql, i18n, docs, routes:{playpoker, pokerSpielen}: (seo), ZP+JavaBridge
Слайд 40Производительность
Почти Hello World test ;-)
Слайд 41Обычная страница без ORM
Ыф
Вид теста: ab –n 1000 –c XXX
512
ram, Intel Pentium 14oo MHz, Windows XP
Слайд 42
Вместе с ORM, без кеша.
Ыф
512Mb RAM 1.8Ghz AMD Sempron
под Ubuntu Gutsy (7.10)
Слайд 43 Ыф
512Mb RAM 1.8Ghz AMD Sempron под Ubuntu Gutsy (7.10)
Вместе с ORM, APC кэшем
Ыф
Слайд 46ZF::Пример проекта.
Создаем сайт-сообщество. Несколько языков, несколько доменов, различные уровни доступа к
ресурсам, маршрутизация, ORM.
Слайд 47Организация разработки
Zend Studio for Eclipse (или просто phpEclipse)
Cruise Control + phpUnderControl
PHPUnit
(Себастьян Бергман)
Smarty
SVN
Ajax: xajax/jQuery/Dojo/Prototype/и т.д.
Firebug + FirePhp (FireZend)
ORM (Doctrine)
Memcached
Слайд 48Zend_Config
site.ru.xml
site.eu.xml
site.zone.xml
en
ru
Слайд 49bootstrap.php
initView();
initRoutes();
initFrontend();
Слайд 50
$view = new Socnet_View_Smarty();
$vRender = new
Zend_Controller_Action_Helper_ViewRenderer($view);
$vRender->setViewBasePathSpec(
dirname(__FILE__).'/V/smarty/templates')
->setViewScriptPathSpec(':module/:controller/:action.:suffix')
->setViewScriptPathNoControllerSpec(':action.:suffix')
->setViewSuffix('tpl');
Zend_Controller_Action_HelperBroker::addHelper($vRender);
Слайд 51 Auth:
$authAdapter = new Zend_Auth_Adapter_DbTable(
$db, 'user', 'login', 'pass');
Zend_Registry::set("Auth", $authAdapter);
Class myAdapter
extends Zend_Auth_Adapter_Interface
public function authenticate();
Слайд 52ACL
$roleAdmin = new Zend_Acl_Role(Socnet_Auth_Acl::ADMIN);
$this->addRole($roleAdmin, $roleMember);
$this->addResource('forum/topic');
$this->deny(null, null); // Запрет всем для всего.
$this->allow(null,
'forum'); // всем доступ к форуму
$this->allow(null, 'ajax'); // всем к ajax
$this->allow($admin, ‘admin');
Слайд 53Маршрутизация
$route = new Zend_Controller_Router_Route(ajax/:widgetName/:widgetAction',
array(
'controller' => ‘ajax',
'action' => 'index',
'widgetName' => '',
'widgetAction' => 'index'
));
$router->addRoute('widget_request', $route);
Слайд 55Unit-тестирование
/tests
Auth
Controller
Domain
Model
Members
AllTests.php
setUpEnvinronment.php
Слайд 58Модели
/generated
|- BaseModelName
ParticularModel extends BaseModelName
phpDoctrine
.yml
fixtures
Слайд 59
if (extension_loaded('memcache')) {
$frontendOptions = array(
'lifetime' => 7200, // cache lifetime of 2 hours
'automatic_serialization' => true
);
$backendOptions = array();
$frontend = 'Core';
$backend = 'Memcached';
} else {
$frontendOptions = array(
'lifetime' => 7200, // cache lifetime of 2 hours
'automatic_serialization' => true
);
$backendOptions = array(
'cache_dir' => dirname(__FILE__).'/../tmp/' //
);
$frontend = 'Core'; $backend = 'File';
}
$cache = Zend_Cache::factory($frontend, $backend,
$frontendOptions, $backendOptions);
Zend_Registry::set('cache', $cache);
Слайд 60Диспетчеризация
extends Zend_Controller_Dispatcher_Standard
$action = $this->getActionMethod($request);
$doCall = !method_exists($controller, $action);
$request->setDispatched(true);
$controller->preDispatch();
$xajaxargs = $controller->_page->Xajax->getRequestParams();
$sResponse = call_user_func_array(array(&$controller, $action),$xajaxargs);
if (is_a($sResponse, "xajaxResponse")) {
$sResponse = $sResponse->getXML();
}
header($sContentHeader);
Слайд 63Полезные ссылки
Cakephp.org (cake-php.ru) – сайт фреймворка
Cakeforge.com – набор готовых проектов на
cake
codeigniter.com (code-igniter.ru) – сайт фреймворка
symfony-project.org - сайт фреймворка
Framework.zend.com - сайт фреймворка
Zendframework.ru - русский сайт + wiki (новый)
http://habrahabr.ru/blogs/zend_framework/31639/ (Интеграция Zend_Acl и MVC. Часть 1)
http://lobach.info/develop/zf/integrating-zend-framework-and-doctrine/ (Интеграция Zend and Doctrine)
http://phpimpact.wordpress.com/2008/08/04/php-applications-where-is-the-include-coming-from/ (откуда инклюды)
http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html (Prepared statements in mysql)
http://vanav.com.ua/post397 (Сравнение скорости PDO, ADOdb, MDB2, Zend_Db, и т.п.)
http://club.shelek.ru/viewart.php?id=300 (Сравнительный тест систем кэширования user data для PHP)
http://www.dklab.ru/chicken/nablas/49.html (оптимизация Загрузки в 22 раза - Котеров)
httphttp://http://zendframeworkhttp://zendframework.http://zendframework.ruhttp://zendframework.ru/http://zendframework.ru/articleshttp://zendframework.ru/articles/http://zendframework.ru/articles/chtohttp://zendframework.ru/articles/chto_http://zendframework.ru/articles/chto_takoehttp://zendframework.ru/articles/chto_takoe_http://zendframework.ru/articles/chto_takoe_zendhttp://zendframework.ru/articles/chto_takoe_zend_http://zendframework.ru/articles/chto_takoe_zend_frameworkhttp://zendframework.ru/articles/chto_takoe_zend_framework/ (обзорно про ZF)
httphttp://http://kpumukhttp://kpumuk.http://kpumuk.infohttp://kpumuk.info/http://kpumuk.info/phphttp://kpumuk.info/php/http://kpumuk.info/php/zendhttp://kpumuk.info/php/zend-http://kpumuk.info/php/zend-frameworkhttp://kpumuk.info/php/zend-framework-http://kpumuk.info/php/zend-framework-routerhttp://kpumuk.info/php/zend-framework-router-http://kpumuk.info/php/zend-framework-router-forhttp://kpumuk.info/php/zend-framework-router-for-http://kpumuk.info/php/zend-framework-router-for-subdirectoryhttp://kpumuk.info/php/zend-framework-router-for-subdirectory-http://kpumuk.info/php/zend-framework-router-for-subdirectory-basedhttp://kpumuk.info/php/zend-framework-router-for-subdirectory-based-http://kpumuk.info/php/zend-framework-router-for-subdirectory-based-sitehttp://kpumuk.info/php/zend-framework-router-for-subdirectory-based-site/#http://kpumuk.info/php/zend-framework-router-for-subdirectory-based-site/#morehttp://kpumuk.info/php/zend-framework-router-for-subdirectory-based-site/#more-31 (Роутеры в Zend)
http://devzone.zend.com/article/3811-Using-Zend_Tool-to-start-up-your-ZF-Project (Zend_Tool – для создания рабочей копии проекта
http://www.avnetlabs.com/php/php-frameworks-revisited-codeigniter-vs-zend-framework (еще одно сравнение фреймворков)
http://snook.ca/archives/php/codeigniter_vs_cakephp/ (CI vs Cake)
http://www.avnetlabs.com/php/php-framework-comparison-benchmarks (Довольно хорошие сравнительные тесты)
Слайд 64
http://phpimpact.wordpress.com/2008/07/28/zend-framework-architecture/ (архитектура Zend’a)
httphttp://http://wikihttp://wiki.http://wiki.ringsidenetworkshttp://wiki.ringsidenetworks.http://wiki.ringsidenetworks.orghttp://wiki.ringsidenetworks.org/http://wiki.ringsidenetworks.org/displayhttp://wiki.ringsidenetworks.org/display/http://wiki.ringsidenetworks.org/display/ringsidehttp://wiki.ringsidenetworks.org/display/ringside/http://wiki.ringsidenetworks.org/display/ringside/Layeringhttp://wiki.ringsidenetworks.org/display/ringside/Layering+http://wiki.ringsidenetworks.org/display/ringside/Layering+andhttp://wiki.ringsidenetworks.org/display/ringside/Layering+and+http://wiki.ringsidenetworks.org/display/ringside/Layering+and+Cachinghttp://wiki.ringsidenetworks.org/display/ringside/Layering+and+Caching+http://wiki.ringsidenetworks.org/display/ringside/Layering+and+Caching+Design (слои в архитектуре)
http://www.zend.com/en/products/platform/ (Zend Platform – aka
Php Application Server – стоит почитать)
http://phpimpact.wordpress.com/category/frameworks/ (много интересных статей)
httphttp://http://wwwhttp://www.http://www.settihttp://www.setti.http://www.setti.bizhttp://www.setti.biz/574/ (сравнение CodeIgniter с Cake)
http://ajaxpatterns.org/Frameworks_Matrix (матрица JS-фреймворков)
http://www.symfony-project.org/tutorial/1_0/my-first-project (Symfony: 1st project )
http://paul-m-jones.com/blog/?p=236 (обзор производительности)
http://manual.cakephp.org/view/326/the-cake-blog-tutorial (1-й проект на cake)
Слайд 65Есть вопросы?
alex@antalika.com
Icq: 286-41-77-45
Skype: horal777
Алексей Граков