Zend framework что это
PHP - это популярный язык для разработки веб-сайтов. Однако, как показывает практика, писать сайты на "чистом" PHP сложно. Когда вы пишете веб приложение на "чистом" PHP, вам приходится организовывать свой код каким-либо способом, собирать и проверять данные, введенные пользователем, реализовывать аутентификацию и авторизацию, взаимодействовать с базой данных, тестировать свой код и т.д. Когда ваш сайт растет в размерах, становится все сложнее разрабатывать код однообразным и стандартизованным образом. Каждый член вашей команды вводит свои собственные способы организации кода. Ваш код становится слишком сложным, медленным и его сложно поддерживать. Вы объединяете весь свой код в один гигантский PHP-скрипт, в котором нет никакого разделения зон ответственности. Вы много раз изобретаете колесо, что приводит к проблемам с безопасностью веб-сайта. Более того, когда вы переключитесь на разработку другого сайта, вы заметите, что большая часть кода, написанного для старого сайта, может быть использована повторно с маленькими изменениями. Этот код может быть выделен в библиотеку. Так и появились фреймворки.
Фреймворк - это библиотека, кусок программного обеспечения, также написанный на PHP, предоставляющий разработчикам базу и стандартные пути для создания веб-приложений.
Zend Framework 3 - это бесплатный PHP-фреймворк с открытым исходным кодом. Его разработка направляется и спонсируется компанией Zend Technologies, также разработавшей и сам язык PHP. Первая версия (Zend Framework 1) была выпущена в 2007; Zend Framework 2, вторая версия этого ПО, была выпущена в сентябре 2012. Zend Framework 3 (или коротко ZF3) была выпущена в июне 2016.
Zend Framework 3 предоставляет вам следующие возможности:
Разрабатывайте свой веб-сайт гораздо быстрее, чем вы бы это делали на чистом PHP. ZF3 предоставляет много компонентов, которые могут использоваться как база для создания сайтов.
Более простое взаимодействие с членами вашей команды. Шаблон "Модель-Вид-Контроллер", используемый в ZF3, позволяет разделять бизнес-логику и слой презентации, делая структуру кода более однообразной и управляемой.
Масштабируйте ваш веб-сайт, используя концепцию модулей. ZF3 использует термин модуль, позволяющий разделять слабо связанные части сайта, таким образом повторно используя классы моделей, вида и контроллеров в других ваших работах.
Получайте доступ к базе данных в объектно-ориентированном стиле. Вместо того, чтобы напрямую взаимодействовать с БД посредством SQL-запросов, используйте Doctrine Object-Relational Mapping (ORM), чтобы управлять структурой и отношениями ваших данных. С Doctrine вы работаете с таблицей БД как с классом на языке PHP, также называемый классом "сущности" (entity), а строка из таблицы БД представляется экземпляром такого класса. Doctrine позволяет абстрагироваться от типа БД и одинаково работать, например с MySQL и PostgreSQL.
Создавайте безопасные веб-сайты с использованием таких компонентов, как фильтры (filters) и валидаторы (validators) форм, HTML output escapers и криптоалгоритмы, human check (Captcha) и Cross-Site Request Forgery (CSRF) элементы форм.
Это просто фреймворк, или этот фреймворк олицетворяет собой гордость PHP-сообщества — его трудолюбивых разработчиков, так сказать, ключевой ингредиент? С россыпью конфигов… Предмет любви нашего ЯП, обладающий хорошим MVC, благодаря чему Zend Framework — самый лучший фреймворк на PHP.
Здесь вы не найдёте ответа на этот вопрос, зато узнаете про ServiceManager и ModuleManager.
Шаг 2: Настройте среду Zend Framework
После завершения загрузки извлеките файлы на рабочий стол, чтобы получить четкое представление о содержимом. Внутри много папок, но для целей этого урока нам понадобятся только две – папка bin и library .
Ради организации, поместите папку bin папку PHP и переименуйте ее в zend-bin . У меня есть D:\Development\PHP , поэтому конечный результат должен быть D:\Development\PHP\zend-bin .
Перейдите в папку library и вы должны найти папку Zend . Поместите это inside your PHP's include_path . Для меня это D:\Development\PHP\includes , поэтому перемещение его туда должно привести к D:\Development\PHP\includes\Zend . Не забудьте скопировать папку Zend папку library , а не в саму папку library .
Наконец, нам нужно настроить инструмент Zend CLI в папке zend-bin для работы в любом каталоге. Для этого нам нужно добавить каталог в Path переменную Path , чтобы мы могли вызывать его из командной строки.
Щелкните правой кнопкой мыши ссылку « Computer разделе «Пуск», чтобы открыть окно « System Information о System Information Здесь, нажмите на Advanced System Settings .
В открывшемся окне нажмите кнопку Environment Variables . В новом окне найдите переменную Path в списке System variables . Нажмите на Edit и добавьте ваше местоположение в каталоге zend-bin в конце.
Когда вы закончите, просто нажмите кнопку OK чтобы сохранить его.
Чтобы убедиться, что наша конфигурация работает, откройте командную строку и выполните команду zf --help . Это должно вывести команды, которые мы можем использовать с инструментом Zend CLI. Если это не так, попробуйте перезагрузить компьютер, чтобы убедиться, что системные переменные реализованы.
Кроме того, в zf.sh zend-bin находится файл zf.sh Это для операционных систем на основе Unix, таких как OSX или Linux. Просто установите переменные среды соответственно, чтобы получить тот же результат.
Плюсы:
- Zend Framework — набор классов, большинство которых не привязаны к друг другу, а значит можно использовать как по запчастям в других проектах так и полностью. В данном каркасе есть все, что нужно в современном ВЕБ проекте.
- Наличие компонентом для работы со сторонними сервисами.
- Объектно ориентированный подход (ООП).
- Основывается на идеях MVC.
- Хорошая документация.
Full Package — содержит в себе Dojo Toolkit, и демки по работе с каркасом. Поскольку ты только приступаешь к изучению этого фреймворка, то рекомендую скачать именно этот вариант. Изучение демок еще никому не повредило.
Minimal Package — содержит только библиотеку Zend Framework.
Распаковываем папку с каркасом(/library/Zend), ZF лучше держать на несколько уровней выше, что бы не плодить файлы для каждого проекта, у меня на пример получилось так в нутрии этой папочки D:\library\ZF\1.7.8\Zend\ .
Coding Compleate
Для начала думаю, что хватит. Для первого знакомства мы рассмотрели достаточно много интересных вещей. Пока может быть не все понятно, но не волнуйся. Мастерство приходит со временем. Главное не лениться и пытаться что—то сделать. В статье я упомянул, что Zend Framework базируется на архитектуре MVC. В статье я не стал делать упор на теорию, т.к. ее написано уже в достаточном объеме и ты можешь найти ее в инете самостоятельно. Если тебя испугали или ввели в тупик слова «вид», «контроллер», то бегом открывай гугл и читай основы MVC. Все, на этом разрешите откланяться.
До скорой встречи!
Устройство фреймворка
Шаг 3: Создайте свой первый проект Zend Framework
Теперь мы приступаем к реальной разработке нашего проекта Zend Framework. В командной строке перейдите в каталог, куда вы хотите поместить файлы проекта (в идеале это должен быть каталог, на который указывает ваш локальный веб-сервер). Для меня это D:\Development\htdocs\nettuts , так что я буду запускать команду cd D:\Development\htdocs\nettuts в моем приглашении.
Введите следующую команду, чтобы создать наш базовый проект Zend Framework: zf create project thenextsocial . В команде thenextsocial – это название нашего проекта. Когда вы начнете создавать свои собственные проекты ZF, замените его соответствующим именем проекта.
Проверьте содержимое папки сейчас – вы должны увидеть новую thenextsocial папку. Внутри папки вы должны увидеть несколько файлов проекта. Самое главное, вы должны увидеть public папку, которая должна быть единственной общедоступной папкой через браузер. Чтобы сделать это доступным, теперь нам нужно настроить VirtualHost для проекта.
Вам также необходимо добавить домен в локальный файл hosts . Для пользователей Windows это должно быть в C:\Windows\System32\Drivers\etc Для пользователей ОС на основе Unix он должен находиться в /etc/hosts . Откройте его и добавьте thenextsocial.local и укажите его на 127.0.0.1
Поздравляем! Вы успешно создали свой первый проект Zend Framework!
Схема
Термины
- Приложение — конечный продукт, сайт;
- Модуль — функционально завершенный "блок" приложения, код которого может состоять из моделей, представлений, контроллеров. Модуль расширяет функциональные возможности веб-приложения и может функционировать лишь "внутри" него; Модули регистрируются в application.config.php в секции modules
- ModuleManager — контейнер для манипуляций модулями;
- Сервис — "механизм" в модуле, для манипуляций между моделями, контроллерами, видами, прочее; Сервисы регистрируются в module.config.php в секции service_manager .
- ServiceManager — контейнер для манипуляций сервисами.
- ControllerManager — работает с сервисами и фабриками для загрузки контроллеров ( \Zend\ServiceManager\AbstractFactoryInterface или \Zend\ServiceManager\ServiceManager ). дока
- EventManager — компонент, который агрегирует обработчики событий (Listener) для одного и более именованных событий (Event), а также инициирует обработку этих событий.
- Плагин — класс, который некоторым образом расширяет функциональность всех контроллеров.
Начнем с минусов:
- Тяжеловесный, версия 1.8.a весит 17 с копьем метров (так, не нужно бояться), хотя это не так уж и много. Если тебя напугал размер, то посмотри готов размеры многих коммерческих CMS. Почти все они переваливают за 10 метров и это неудивительно, ведь функций у них до фига. С Zend Framework аналогичная история. Возможностей он предоставляет массу, но не факт, что ты ими всеми сможешь воспользоваться.
- Требует много времени для изучения. На самом деле здесь все индивидуально. Одни могут целый год топтаться на месте, а другим достаточно несколько дней и они уже готовы писать свои первые приложения.
- Ресурсоемкий. Если честно, то я не видел еще не одного хостера который бы загнулся от Zend Framework.
Это все, что я обнаружил из минусов.
Зачем использовать Zend Framework?
Основная задача любого CMF сократить время разработки проекта. Используя данный продукт, ты сможешь добиться:
- Постоянной структуры проектов. Проблема большинства проектов, разрабатываемых с нуля — отсутствие постоянной структуры. Сначала ты засунул нужную функцию в один модуль, в следующем проекте ты понял, что сделал ошибку и решил все поменять. В итоге, чем больше ты создаешь сайтов/web — приложений, тем больше ты совершенствуешь свои знания, а значит вносишь изменения в структуру новых проектов. А вот теперь попробуй представить, что тебе рано или поздно придется вернуться к поддержке/доработке своего самого старого проекта. Уверен, что ты просто запутаешься или потратишь много времени на разбор кода. При создании web — приложений на базе фреймворков эта проблема отпадает, т.к. ты всегда руководствуешься правилами. Такой подход может гарантировать, что даже при необходимости доработать самый старый проект, ты всегда будешь знать его структуру и без труда сможешь внести доработки.
- Повысить скорость разработки. В Zend Framwork реализовано множество классов, позволяющих реализовать множество типовых действий. Тебе не нужно будет изобретать очередной велосипед, т.к. у тебя имеется целый КАМАЗ уже готовых великов :).
- Повышения уровня безопасности. Ошибки допускают все и от них никто не застрахован. С этим трудно поспорить, но с помощью Zend Framework можно существенно сократить уровень ошибок в проекте. Поскольку множество типовых действий реально сделать с помощью встроенных классов, то значит тебе придется писать меньше кода, а чем меньше кода, тем меньше ошибок.
Шаг 4: Узнайте о структуре MVC Zend Framework
Общая структура и связи
Когда создается Zend\Mvc\Application , объект Zend\ServiceManager\ServiceManager создается и настраивается через Zend\Mvc\Service\ServiceManagerConfig . ServiceManagerConfig получает конфигурацию из config/application.config.php (или какой-либо другой конфиг приложения, который передаётся в Application при его создании). Из всех сервисов и фабрик, представленных в пространстве имен Zend\Mvc\Service , ServiceManagerConfig является ответственным только за три: SharedEventManager , EventManager и ModuleManager .
После этого Application извлекает ModuleManager . В этот момент ModuleManager через ServiceManager конфигурирует сервисы и фабрики, предоставляемые в Zend\Mvc\Service\ServiceListenerFactory . Такой подход позволяет максимально упростить конфигурацию основного приложения и предоставить разработчику возможность конфигурировать различные части системы MVC из модулей, переопределяя любую конфигурацию по умолчанию в сервисах этих MVC.
ModuleManager , выражен в Zend\Mvc\Service\ModuleManagerFactory . Это, пожалуй, самая сложная фабрика в стеке MVC. ModuleManager ожидает, что сервис ApplicationConfig внедрён (Di) с ключами module_listener_options и modules .
Он создает экземпляр Zend\ModuleManager\Listener\DefaultListenerAggregate , используя извлеченные module_listener_options . Затем проверяет, существует ли сервис с именем ServiceListener , если нет, то использует фабрику с именем Zend\Mvc\Service\ServiceListenerFactory . В ServiceListener будет добавлено множество сервисов слушателей, таких, как слушатели методов getServiceConfig , getControllerConfig , getControllerPluginConfig , getViewHelperConfig модуля.
Затем ModuleManager извлекает сервис EventManager и присоединяет вышеупомянутых слушателей. Он создает экземпляр Zend\ModuleManager\ModuleEvent , установив параметр "ServiceManager" в объект менеджера сервисов. Наконец, он создает экземпляр Zend\ModuleManager\ModuleManager и внедряет EventManager и ModuleEvent .
[моё] Тот случай, когда кодом понятнее:
Связи
Создадим 404 страницу
Создаем еще один контроллер в нашем модуле, ErrorController.php
Содержание ErrorController.php:
MVC в приложении на основе Zend Framework
Преимущество использования инструмента ZF CLI состоит в том, что оно автоматически настраивает ваше приложение на использование классов MVC Zend Framework, что позволяет вам быстрее приступить к работе над проектами.
Возвращаясь к нашему проекту, откройте папку « thenextsocial/application », и вы должны увидеть – как вы уже догадались – папки models, views, and controllers .
Внутри этих папок откройте controllers/IndexController.php и views/scripts/index/index.phtml . Если вы внимательно посмотрите на оба этих файла, то увидите, что домашняя страница, которую мы видели выше ( Welcome to Zend Framework ), фактически выполняется обоими этими файлами. Так как же Zend Framework это называет?
Объяснение маршрутизации приложений Zend Framework по умолчанию
По умолчанию все URL-адреса в вашем проекте Zend Framework будут иметь определенный формат:
Цикл маршрутизации Zend Framework по умолчанию
Затем Zend Framework принимает значение контроллера и ищет его в папке controllers , а именно в нашем файле IndexController.php . Внутри файла контроллера он принимает значение нашего действия и выполняет этот метод, который является indexAction . После того, как действие было выполнено в контроллере, ZF автоматически отображает файл представления в папке представлений в следующем формате:
Вот почему мы видим страницу Welcome to Zend Framework , так как index.phtml содержит HTML-код этой страницы.
Делаем структуру проекта
Организуем файловую структуру для нашего будущего проекта. В корне приложения создаем два каталога, application — там будут храниться все наши программные модули проекта и public в которой будут находиться обще доступные файлы. Так же в корне создадим index.php и .htaccess в который сразу добавим правила перенаправления.
Файл .htaccess:
В папку public тоже нужно добавить .htaccess только с другим содержанием.
Файл /public/.htaccess :
В папки application создадим 3 папки: configs, library, modules.
configs — тут будут файлы конфигураций проекта.
library — здесь будут дополнительные библиотеки.
modules — а тут будут находиться модули нашего приложения.
После всех этих нехитрых манипуляций у меня получилась вот такая структура:
Раз структура готова, то можно переходить к кодингу ;-)
Открываем наш индексный файлик — index.php. Указываем интепритаору, что сейчас начнется php код и определим четыре константы:
PATH_TO_ZF — путь до ZF
PATH_TO_APPLICATION — путь к нашей папочки application
PATH_TO_LIBRARY – путь к нашем библиотекам
PATH_TO_MODULES – путь к нашим модулям
Теперь укажем интепритатору от куда подгружать все наше добро:
Так, следующим шагом нужно подгрузить Zend_Loader (чуть позже мы к нему вернемся) и зарегистрируем автозагрузку классов
Так, Zend_Loader подгрузили, теперь проинициализируем Zend_Controller_Front (о нем тоже чуть позже) и укажем диспетчеру местонахождения наших модулей. После этого запустим процесс диспетчеризации.
В итоге должно получиться что вроде этого:
Как ты заметил Zend_Controller_Front нигде не подгружается, т.к. Zend_Loader подгрузил Controller автоматически. Узнает Zend_Loader расположение контроллера по его имени:
Класс Zend_Controller_Front лежит в Zend/Controller/Fron.php
Плюсы и минусы Zend Framework
Идеальных решений не бывает и ZF не исключение. У него есть свои минусы и плюсы, о которых мы сейчас и поговорим.
Визуализация
- Читается сверху вниз, если не задано иное стрелками.
- Линии со стрелками указывают что во что входит.
- Тонкие линии без стрелок указывают что с чем связано.
- Толстые линии без стрелок указывают что чем управляет.
Делаем модуль
Едем дальше. В папке модуля создадим еще две папки:
controllers — тут будут контроллеры модуля
views — а здесь все что связано в видом (представлением)
Создадим новый контроллер(IndexController.php), и вставим в него вот этот код:
Общий вид контроллера у меня выглядет так:
А в файл вида добавим:
И обновляем страницу.
Введение: что такое Zend Framework?
Zend Framework – это полнофункциональный PHP-фреймворк, созданный Zend Technologies. Для тех, кто не знаком с компанией, Zend Technologies предоставляет веб-разработчикам различные инструменты, которые помогут им в их работе. Яркими примерами являются Zend Server, сервер веб-приложений для запуска и управления PHP-приложениями, и Zend Studio, полнофункциональная IDE для PHP. Излишне говорить, что Zend очень инвестировал в PHP, поэтому Zend Framework – отличный инструмент для добавления в арсенал любого разработчика.
Zend Framework состоит из множества различных библиотек и классов. Это обоюдоострый меч – с одной стороны, разработчикам легче подбирать библиотеки, если им нужно только немного. Недостатком является то, что настройка фреймворка в начале не очень проста, так как это просто набор классов. При этом у Zend есть инструмент scaffolding и рекомендуемый способ настройки структуры вашего приложения, который мы обсудим в этом конкретном руководстве.
В этой серии руководств мы рассмотрим, как работает Zend Framework, и узнаем, как использовать его различные компоненты. К концу серии мы создадим совершенно новый сайт социальной сети – с базовым профилем, сетью, обновлениями статуса и даже функциями API. А теперь, без лишних слов, давайте начнем!
Что это за паттерн MVC?
Из краткого описания Zend Framework:
Шаблон модель-представление-контроллер (MVC)
Шаблон MVC хорошо моделирует это разделение проблем.
Итак, что же это за паттерн MVC, о котором все продолжают говорить, и почему вас это должно волновать? MVC – это нечто большее, чем просто трехбуквенная аббревиатура (TLA), которую вы можете использовать в любое время, когда хотите звучать умно; это стало чем-то вроде стандарта в дизайне современных веб-приложений. И не зря. Большая часть кода веб-приложения подпадает под одну из следующих трех категорий: представление, бизнес-логика и доступ к данным. Шаблон MVC хорошо моделирует это разделение проблем. Конечным результатом является то, что ваш код презентации может быть объединен в одной части вашего приложения с вашей бизнес-логикой в другой и вашим кодом доступа к данным в другой. Многие разработчики считают, что это четко определенное разделение необходимо для организации их кода, особенно когда над одним приложением работают несколько разработчиков.
Суть этого в следующем: модели содержат нашу бизнес-логику, представления содержат наш HTML, а контроллеры поддерживают все в соответствии и сообщают представлениям и моделям, что делать.
А это не сложно?
Кто то говорит что Zend Framework слишком сложен для понимания, тяжеловесный, требует много ресурсов сервера. В реале это не так. Если ты смог освоить PHP, то разобраться с Zend Framework сможешь и подавно, а что касается тяжеловесности, то хорошая диета без проблем устранит этот недостаток.
Шаг 1: Загрузите Zend Framework
Zend Framework Ссылка для Download Now
Это должно привести вас к экрану со списком различных загрузок для Zend Framework. В будущем, когда вы обновите библиотеку Zend Framework, вам следует загрузить Minimal версию, которая содержит только файлы ZF. А пока давайте Zend Framework 1.11.11 Full , который содержит библиотеку со всеми демонстрациями и тестами. Он также включает инструмент скаффолдинга, который мы будем использовать позже в этом уроке.
Zend Framework скачать список
Полезные ссылки
Не хочу заниматься копипастой и выращивать 6 частей на одну тему, поэтому прикладываю список моих закладок по ZF с примечаниями:
Аннотация от переводчика
PHP — один из самых широко распространенных языков разработки веб-приложений и при этом один из самых спорных. Я очень часто видел негативное отношение к этой технологии, да и недостатки, провоцирующие это отношение — не для кого не являются секретом. Тем не менее, PHP активно эволюционирует и во многих отношениях постепенно становитс лучше. Одним из серьезных шагов его развития, на мой взгляд, является появление MVC-фреймворков, призванных систематизировать процесс разработки веб-приложений и приучить к порядку разработчиков, которым зачастую здорово не хватает силы воли, чтобы при всей предоставляемой языком свободе, сохранить грамотную и красивую инфраструктуру разрабатываемого ПО (сразу уточню, что последнее утверждение субъективно и основано исключительно на виденном мной коде различных программных решений).
В последнее время я активно заинтересовался архитектурой MVC и сделал свою собственную реализацию фреймворка на этой концепции для PHP4. Совсем недавно на глаза попался первый официальный релиз Zend Framework, о котором я давно слышал, но все руки не доходили с ним поиграть. Для PHP существуют и другие подобный библиотеки, но в данном случае привлек бренд.
Вначале я испытал некоторое разочарование в официальной документации, которая оказалась хорошим reference-ом, но просто никаким tutorial-ом и поэтому на роль вводного материала не подошла. Но почти сразу нашлась неплохая статья, в которой автор пошагово разбирает процесс создания веб-приложения. Материала достаточно, чтобы разобравшись в нем можно было начать осмысленно ориентироваться в мане от Zend. Текст ориентирован на программистов, имеющих некоторый опыт в программировании веб-приложений на PHP, но не знакомых с Zend Framework.
Статья довольно объемная, поэтому я решил разделить ее на две части, дабы не перегружать никому мозг. Ниже я привожу первую часть ее перевода, в которой в общих чертах освещена концепция MVC и разобрана структура веб-приложения, реализованного на Zend Framework. Если материал заинтересует хабрачитателей, я опубликую продолжение.
Материал рассчитан на то, чтобы дать общее представление об использовании Zend Framework для создания простейших приложений с использованием баз данных. Приведенные примеры были протестированы на Zend Framework версии 1.0.0. Скорее всего, они будут работать и с более поздними версиями, но не с более ранними.
Архитектура Модель-Вид-Контроллер
PHP-приложение, написанное традиционным способом, может представлять собой некое подобие следующего примера:
В ходе жизненного цикла приложений подобного типа, трудоемкость их поддержки становится крайне высока, т. к. меняющиеся требования заказчика приводят к необходимости вносить большое количество изменений («заплаток») в исходный код. Это делает его плохо структурированным и трудно читаемым. Один из методов для повышения гибкости приложения состоит в разделении кода на три категории:
- Модель. Моделью называют ту часть приложения, которая относится к работе с данными. в приведенном выше фрагменте кода, это реализация новостной ленты. Подобные модели широко применимы в управляющей логике приложений, имеющих в своей основе базы данных.
- Вид. Под термином «вид» подразумевается пользовательский интерфейс приложения.
- Контроллер. Контроллеры реализуют задачи, связанные со взаимодействием между моделью и видом.
Системные требования
У Zend Framework следующие требования:
- PHP версии 5.1.4 или выше;
- Веб-сервер, поддерживающий mod_rewrite.
Где скачать Zend Framework
Структура директорий
На данный момент в Zend Framework жестко не стандартизирована структура директорий приложения, но в официальной документации рекомендуется использовать общепринятую схему. Эта схема основана на том, что пользователь, как предполагается, имеет полный доступ к конфигурированию сервера Apache. Мы же будем использовать немного видоизмененный подход, чтобы смягчить данные требования и сделать Zend Framework более применимым в условиях широко распространенного разделяемого хостинга.
Для начала, создайте директорию zf-tutorial в корневом каталоге вашего тестового веб-сайта. Это будет означать, что URL этой директории примет вид localhost/zf-tutorial (адрес может варьироваться, в зависимости от настроек вашего сервера).
После этого дополнительно создайте следующую структуру каталогов для хранения файлов веб-приложения:
Как можно понять из названий, мы выделили специальные директории для файлов моделей, видов и контроллеров приложения. Графика, скрипты и CSS файлы будут храниться в отдельных подкаталогах, расположенных внутри открытой для публичного доступа директории public .
Для начала, разархивируйте скачанный файл ZendFramework-1.0.0.zip (или .tar.gz ) во временную директорию. Все файлы внутри архива находятся в директории ZendFramework-1.0.0 . Скопируйте содержимое library/Zend в zf-tutorial/library . Теперь ваша директория zf-tutorial/library должна содержать подкаталог Zend .
Начальная загрузка
Контроллер Zend_Controller из библиотеки Zend Framework спроектирован для поддержки сайтов с хорошо читаемыми («чистыми») URL. Для достижения этой цели, все запросы к серверу перенаправляются для обработки на специальный файл index.php , именуемый так же файлом начальной загрузки (bootstrapper). Такой подход обеспечивает централизованную организацию инфраструктуры приложения и гарантирует корректную для его функционирования настройку программного окружения. Это достигается благодаря использованию конфигурационного файла .htaccess , который находится в директории zf-tutorial .
Директивой RewriteRule задано очень простое правило перенаправления URL, которое может быть переведено на человеческий язык, как «использовать index.php вместо любого URL». Для обеспечения безопасности так же откорректированы некоторые настройки интерпретатора PHP. в принципе, они уже должны быть заданы соответствующим образом в конфигурационном файле php.ini любого грамотно настроенного сервера, но в нашем примере они дублируются локально для большей надежности. Обратите внимание на то, что директива php_flag внутри файла .htaccess может применяться только при использовании mod_php . Если вы используете PHP через CGI или FastCGI, необходимо удостовериться в правильной настройке php.ini .
Вопреки сказанному выше, запросы, относящиеся к графическим файлам, JavaScript и CSS, не должны быть перенаправлены на index.php . Учитывая, что все они хранятся в отдельной директории public , мы с легкостью можем настроить Apache, чтобы сервер отдавал их напрямую. Для этого необходимо создать еще один файл .htaccess в директории public и задать в нем соответствующую директиву.
Для повышения безопасности, можно создать дополнительные файлы .htaccess в директориях zf-tutorial/application и zf-tutorial/library , с одинаковым содержимым.
zf-tutorial/application /.htaccess, zf-tutorial/library/.htaccess:
Эта директива закроет доступ из web к содержимому указанных директорий. (Прим. переводчика: последние два файла можно не создавать вообще, если все, что находится вне директории public , заведомо закрыто глобальными настройками сервера).
Файл начальной загрузки index.php
Файл начальной загрузки zf-tutorial/index.php содержит следующий код:
Заметьте, что в конце файла отсутствует закрытие блока PHP кода ?> , т. к. в нем нет необходимости. Кроме того, наличие закрывающего тага может привести к появлению сложных для выявления ошибок при редиректе функцией header() , если в конце файла по недосмотру останутся лишние пробелы.
Рассмотрим код подробнее.
Zend Framework рассчитан на то, чтобы его файлы находились в include_path , поэтому мы добавляем к значению этого параметра путь к нужной директории. Помимо него, в include_path добавляется директория моделей, чтобы облегчить подключение файлов и из нее.
Файл Zend/Loader.php содержит класс Zend_Loader со статическими функциями, позволяющими подключать любой класс из Zend Framework.
Метод Zend_Loader::loadClass() подключает класс с заданным именем. Для этого выполняется преобразование указанного имени в путь к соответствующему файлу: символы «_» заменяются на «/», а в конце получившейся строки добавляется расширение .php . Таким образом, Zend_Controller_Front преобразуется в Zend/Controller/Front.php . Если следовать аналогичной схеме построения имен для собственных библиотечных классов, то метод Zend_Loader::loadClass() можно будет использовать и с ними.
Класс, который понадобится нам прежде всего, — первичный контроллер. При его работе, в свою очередь, используется специальный класс-роутер, чья задача состоит в нахождении по заданному URL функции отображения соответствующей веб страницы. Для этого роутере должен быть определен базовый URL файла index.php , относительно которого он сможет выделять URI отдельных страниц.
Базовый URL может автоматически определяется с помощью объекта Request , а для того, чтобы применить его в нашем примере следует воспользоваться методом $frontController->setBaseUrl() .
Далее нам понадобится сообщить первичному контроллеру о местоположении директории с другими контроллерами:
В итоге, после всех выполненных приготовлений, наше приложение может быть запущено:
Это говорит о том, что мы еще не до конца сформировали наше веб-приложение. и прежде чем приступить к делу, стоит уяснить, в чем конкретно состоит задача.
Веб-сайт
Предположим, что мы хотим создать простую базу данных для хранения информации о компакт-дисках. На главной странице будет отображен список дисков в нашей коллекции, а так же будет предоставлена возможность добавлять новые CD, редактировать и удалять ненужные записи. Для хранения данных, используем базу со схемой, приведенной ниже:
Fieldname | Type | Null? | Notes |
---|---|---|---|
id | Integer | No | Primary key, Autoincrement |
artist | Varchar(100) | No | |
title | Varchar(100) | No |
Необходимые страницы
Для реализации перечисленных выше функций, нам понадобятся следующие страницы:
Организация страниц
Прежде чем приступить к созданию файлов, следует понять, как принято организовывать их в Zend Framework. Согласно принятой терминологии, каждая страница веб-приложения определяется термином «действие».
Примечание переводчика. Небольшое пояснение терминологии. Англоязычным оригиналом используемого в данной статье термина «действие» является слово action. Приведенный перевод на данный момент еще не является устоявшимся понятием, и в некоторых текстах о модели MVC вместо него попадаются иные определения. Например, так же известна прямая (и режущая слух) транслитерация — «экшен».
В Zend Framework так же используются модули для группировки контроллеров, но наше приложение не настолько велико, чтобы имело смысл их применять.
В контроллерах Zend Framework существует понятие действия по-умолчанию, для которого зарезервировано имя index . Такие действия исполняются при обращении к URL вида localhost/zf-tutorial/news (в данном примере выполняется действие index контроллера news ). Помимо исполняемых по-умолчанию действий, так же предусмотрены выбираемые по-умолчанию контроллеры с аналогичным именем — index . Это означает, что URL localhost/zf-tutorial будет соответствовать действию index контроллера index .
Учитывая, что данная статья ориентирована на первое знакомство с Zend Framework, мы не будем пока касаться таких нюансов работы веб-приложения, как авторизация пользователей. Ограничимся реализацией основной функциональности, а именно — набором перечисленных выше страниц. Учитывая, что все они относятся к работе с альбомами, можно отнести их к одному контроллеру. Мы используем стандартный контроллер, а его действия будут выглядеть следующим образом:
Настройка контроллера
Приступим к созданию нашего контроллера. в Zend Framework контроллер представляет собой класс с именем типа Controller . Класс должен быть описан внутри файла с именем Controller.php , в общей директории контроллеров. Стоит обратить внимание на важный нюанс: первая буква в имени класса-контроллера и имени его файла должна быть заглавной, а все остальные — строчными. Каждое действие должно быть открытой функцией класса-контроллера с именем типа Action . в данном случае, имена действий должны начинаться со строчной буквы.
Таким образом, наш класс-контроллер будет носить имя IndexController и находиться в файле zf-tutorial/application/controllers/IndexController.php .
В данном макете контроллера каждое действие будет выводить свое имя. Это можно протестировать, задавая приведенные ниже URL:
URL | Displayed text |
---|---|
localhost/zf-tutorial | in IndexController::indexAction() |
localhost/zf-tutorial/index/add | in IndexController::addAction() |
localhost/zf-tutorial/index/edit | in IndexController::editAction() |
localhost/zf-tutorial/index/delete | in IndexController::deleteAction() |
Теперь у нас имеется работающий класс-роутер с набором действий, соответствующих каждой странице веб-приложения. При возникновении каких-либо проблем в процессе его создания, обратитесь к разделу «Устранение неполадок» в конце статьи.
А теперь пришло время добавить в наше приложение новый вид.
Класс Zend Framework, на базе которого строится вид, называется просто и бесхитростно — Zend_View . Вид позволяет отделить код, отвечающий за отображение страницы, от кода функций-действий.
Простейший вариант использования Zend_View выглядит как показано ниже:
Легко можно понять, что если бы мы захотели поместить приведенный код в каждую функцию-действие, это привело бы к его многократному дублированию, что не явилось бы красивым решением. Вместо этого, мы выполним инициализацию вида отдельно, а из функций-действий затем будем только обращаться к нему.
Разработчики Zend Framework предусмотрели решение этой задачи и для ее решения создали так называемые «помощники действий» (action helpers). Класс Zend_Controller_Action_Helper_ViewRenderer инициализирует свойство view для нашего последующего использования ( $this->view ), а так же занимается отображением скриптов вида. Для рендеринга веб-страниц он использует объект Zend_View , который в свою очередь находит скрипты видов в файлах views/scripts//.phtml (по-умолчанию они хранятся именно там, но при необходимости дислокацию скриптов можно менять).
Итак, для того, чтобы добавить вид в наше приложение, все, что нам потребуется, — создать несколько файлов с тестовым кодом. Никаких принципиальных изменений внутри контроллера не понадобится, но для большей наглядности мы выполним небольшую корректировку выводимого им текста.
Изменения внутри класса IndexController выделены жирным шрифтом.
Внутри каждой функции мы присваиваем значение переменной title свойства view . Заметьте, что при этом в действительности не происходит никакого отображения текста — это задача первичного контроллера, которая будет выполнена в самом конце работы системы.
Теперь нам понадобится добавить четыре файла для видов нашего веб-приложения.
При тестирование каждого из действий, должны быть отображены выделенные заголовки каждой из страниц.
Общий HTML-код
Уже сейчас становится заметно использование одинаковых фрагментов HTML кода в наших видах. Выделим идентичные для всех файлов части в два отдельных файла: header.phtml и footer.phtml , созданных внутри все той же директории со скриптами.
(Обратите внимание на изменения, добавленный в код.)
Файлы видов так же понадобится откорректировать.
Стилевое оформление
Для того, чтобы сделать наше веб-приложение визуально более привлекательным, используем CSS. На этом этапе возникает небольшая проблема, связанная с тем, что заранее неизвестен URL корневой директории, необходимый для ссылки на CSS-файл. Для разрешения этой задачи используется функция getBaseUrl() передаваемого в вид объекта Request . Она и предоставит нам неизвестный заранее фрагмент URL.
Это свойство становится доступным из любого действия, после выполнения IndexController::init() .
Ссылку на CSS-фалй понадобится добавить в секцию файла header.phtml :
Готовы вывести свои навыки PHP на новый уровень? В этой новой серии «С нуля» мы сосредоточимся исключительно на Zend Framework – полнофункциональном PHP-фреймворке, созданном Zend Technologies. Первое в нашей серии руководств – «Начало работы с Zend Framework».
Шаг 5. Передача данных из контроллера в его представление
Относительно просто передать данные из контроллера в его представление. По умолчанию каждый объект контроллера создается для создания экземпляра объекта представления. Доступ к этому объекту представления осуществляется через метод доступа $this->view .
Возвращаясь к нашему проекту, откройте IndexController.php в папке controllers , а в методе indexAction давайте передадим current date and time нашему представлению.
Ты еще мучаешься и в n—раз пишешь однотипные модули для сайта? Изобретаешь велосипед и пытаешься отделить дизайн проекта от кода? Ищешь реализацию необходимой функции в сомнительных форумах? Если на один из этих вопросов ты ответил да, то эта статья однозначно для тебя. В ней я расскажу тебе про мощный бесплатный фреймворк (Content Managment Framework), изучив который ты не только будешь экономить время на разработку проекта, но и поднимешь качество своих работ на новый уровень. Итак, усаживайся по удобнее, и читай мою первую статью из цикла «Учимся работать с Zend Framework».
От автора
Внимательный читатель заметил, что статья начинается со ссылки на Тостер, где задан вопрос про различия ServiceManager и ModuleManager, и с них же начинается текст статьи. Совпадение? Не думаю. Дело в том, что Хабр стал первым местом, откуда я начал знакомство с основами фреймворка и путаницу внесла публикация, где воссоздавался блог из документации с комментариями автора статьи. Именно отсутствие описания ModuleManager толкнуло меня на неправильные рассуждения (что в ServiceManager регистрируются модули) и это привело к написанию данной статьи.
Предупреждение
- Данный материал основан на том, что я искал по Zend Framework 2, кое-где фигурируют даже упоминания по версии 1.*. Не думаю, что это станет проблемой при сопоставлении с другими версиями, так как рассматриваются фундаментальные моменты и вряд ли они глобально изменятся.
- В рассуждениях и переводах (а также в пункте 1) могут оказаться грубые ошибки, как мои, так и первоисточников. На всё будут даны ссылки, а собственное творчество будет с примечанием [моё].
- Ориентировано на тех, кто погуглил и, как я, запутался. Тут не будет разворачивания блогов, пояснений и интерактива. Но будет две картинки и кошечка.
Плагины
Методы событий определены в абстрактном классе Zend_Controller_Plugin_Abstract , от которого должны наследовать все пользовательские плагины
Содержание
- Термины
- Устройство фреймворка
- Общая структура и связи
- Плагины
- Связи
- Схематичное представление
- Полезные ссылки
Немного о контроллере
Zend_Controller_Front реализует паттерн Синглетон, а значит он может быть инициализирован в проекте только один раз. При вызове метода dispatch(), диспетчер уходит в цикл диспечерезации, проходящий три события:
Читайте также: