| « Поставить закладку » « Сделать стартовой » | |||
|
|||
| Статьи:: Интернет технологии :: PHP :: Введение в Zend Framework. Часть 2
Введение в Zend Framework. Часть 2Для печати рекомендуется использовать полную версию статьи в формате PDF: zend-fw-intro.pdf Автор: Роб Ален, http://akrabat.com Оригинал: http://akrabat.com/zend-framework-tutori… Перевод: Александр Мусаев, http://paradigm.ru База данныхТеперь, когда управляющая часть нашего приложения и код визуализации разделены, пришло время заняться моделью. Запомните, что модель — базовая часть приложения, которая реализует его основные функции. Следовательно, в нашем случае модель выполняет работу с базой данных. Мы используем класс Zend Framework
Zend_Db_Table, предназначенный для поиска, вставки, обновления и удаления
записей в таблице базы данных.НастройкаДля использованияZend_Db_Table, понадобится сообщить ему, к какой
базе данных, под каким именем пользователя и с каким паролем он будет
обращаться. Принимая во внимание, что эту информацию предпочтительно не забивать
в код, воспользуемся конфигурационным файлом для ее хранения.Zend Framework предоставляет для этой цели класс Zend_Config,
обеспечивающий гибкий объектно-ориентированный доступ к конфигурационным файлам
в форматах INI и XML. Остановим свой выбор на INI-файле:zf-tutorial/application/config.ini:
(Безусловно, вам понадобится использовать свои собственные параметры доступа к БД, а не приведенные в примере.) Использовать Zend_Config будет очень просто:
В данном случае, Zend_Config_Ini загружает одну секцию из INI-файла
(таким же образом при необходимости можно загрузить любую другую секцию).
Возможность именования секций реализована для того, чтобы лишние данные без
нужды не загружались. Zend_Config_Ini использует точку в именах
параметров в качестве иерархического разделителя, благодаря чему можно
группировать родственные параметры. В нашем файле config.ini,
параметры host, username, password и dbname
будут сгруппированы в объекте $config->db->config.Мы будем загружать конфигурационный файл из файла начальной загрузки ( index.php):zf-tutorial/index.php:
После загрузки необходимых для работы классов ( Zend_Config_Ini и Zend_Registry),
в объект $config загружается секция конфигурационного файла
application/config.ini под именем “general”. Далее объект
$config включается в реестр, что обеспечивая доступ к нему из всего
приложения.Замечание: В данном примере нет реальной потребности хранить $config в реестре. Это сделано в качестве примера работы
«настоящего» приложения, в конфигурационном файле которого вам, вероятно,
придется хранить нечто большее, чем параметры доступа к БД. При использовании
реестра, обратите так же внимание, что данные в нем доступны на глобальном
уровне, и что при неосторожном использовании это может стать причиной
потенциальных конфликтных ситуаций внутри приложения.Использование Zend_Db_TableДля того, чтобы использовать классZend_Db_Table, нам понадобится
передать в него параметра доступа к базе данных, которые были только что
загружены. Для этого необходимо создать объект Zend_Db
и зарегистрировать его функцией Zend_Db_Table::setDefaultAdapter().
Ниже приведен соответствующий фрагмент кода в файле первичной загрузки:zf-tutorial/index.php:
Создание таблицыМы будем использовать базу данных MySQL, поэтому SQL запрос на создание таблицы будет выглядеть так:
Этот запрос можно выполнить через любой MySQL-клиент, например, phpMyAdmin или стандартную консольную утилиту. Добавление тестовой записиДобавим несколько тестовых записей в таблицу для проверки функциональности главной страницы, на которой они в последствии должны отображаться.
МодельZend_Db_Table — абстрактный класс, поэтому на его основе необходимо
создать специализированный на нашей задаче класс-наследник. Имя нового класса не
имеет принципиального значения, но такие классы стоит называть аналогично
соответствующим им таблицам БД (это повысит уровень самодокументируемости кода).
Таким образом, для нашей таблицы album имя класса будет Album.Для того, чтобы передать в Zend_Db_Table имя таблицы, которой он
будет управлять, необходимо присвоить это значение защищенному свойству класса
$_name. Стоит отметить, что в классе Zend_Db_Table
по-умолчанию всегда используется ключевое автоинкрементное поле таблицы с именем
id. При необходимости значение имени этого поля так же можно
менять.Класс Album будет храниться в директории моделей.zf-tutorial/application/models/Album.php:
Ничего сложного, не так ли? Учитывая, что наши потребности в данном случае совсем невелики, базовой функциональности Zend_Db_Table хватит,
чтобы полностью их удовлетворить. Если же в ваших задачах понадобится
реализовать более сложные операции взаимодействия с базой данных, то класс
модели — это именно то место, куда стоит поместить соответствующий код.Список альбомовТеперь, когда мы сконфигурировали базу данных, можно приступить к выполнению основной задачи приложения и отобразить несколько записей. Это должно быть реализовано в классеIndexController. Каждая функция-действие
внутри IndexController взаимодействует с таблицей album
через класс Album. Поэтому имеет смысл загрузить его при
инициализации контролера внутри функции init().zf-tutorial/application/controllers/IndexController.php:
Замечание: В данном фрагменте кода приведен пример использования метода Zend_Loader::loadClass() для загрузки
нестандартных классов. Это срабатывает, т. к. директория моделей (в которой
хранится подгружаемый класс Albums) была добавлена нами в include_path.Создадим список альбомов из базы с помощью indexAction():zf-tutorial/application/controllers/IndexController.php:
Функция fetchAll() возвращает объект Zend_Db_Table_Rowset,
который позволит нам сформировать список из всех записей в шаблонном файле вида:zf-tutorial/application/views/scripts/index/index.phtml:
По адресу http://localhost/zf-tutorial/ теперь должен отображаться
список из двух наших альбомов.Добавление нового альбомаТеперь перейдем к функции добавления нового диска в базу. Эта задача состоит из двух частей:
addAction():zf-tutorial/application/controllers/IndexController.php:
Обратите внимание, как в начале функции было определено, имела ли место пересылка данных их формы. Если данные из формы были переданы, мы извлекаем значения artist и title, и обрабатываем их фильтром
HTML тагов Zend_Filter_StripTags. Далее, если строки имеют непустое
значение, мы используем класс Album() для добавления новой записи
в таблицу БД. После добавления альбома, пользователь переадресуется обратно на
главную страницу методом контроллера _redirect().Последнее, что понадобится сделать, — подготовить HTML-форму для шаблона вида. Забегая вперед, можно отметить, что форма редактирования записей будет выглядеть идентично форме для их добавления. Поэтому мы используем общий шаблонный файл ( _form.html),
который будет использован в add.phtml и edit.phtml:Шаблон страницы добавления нового альбома: zf-tutorial/application/views/scripts/index/add.phtml:
zf-tutorial/application/views/scripts/index/_form.phtml:
Получился достаточно несложный код. Учитывая, что мы предполагаем применять _form.phtml еще и при редактировании записей, используем переменную
$this->action, вместо того, чтобы жестко задавать имя необходимого
действия. Таким же образом, через переменную задается надпись на кнопке передачи
данных из формы.Редактирование альбомаРедактирование альбома во многом идентично добавлению новой записи, поэтому и код получается похожим:zf-tutorial/application/controllers/IndexController.php:
Стоит отметить, что в тех случаях, когда не была выполнена передача данных в скрипт из формы, мы можем получить параметр id из свойства
params объекта Request, с помощью метода getParam().Код шаблона приведен ниже: zf-tutorial/application/views/scripts/index/edit.phtml:
РефакторингБезусловно, от вашего внимания не могло ускользнуть, чтоaddAction()
и editAction() очень похожи, а шаблоны добавления и редактировании
записей вообще идентичны. Логично предположить необходимость рефакторинга кода.
Решите эту задачу самостоятельно, в качестве дополнительного практического
упражнения.Удаление альбомаДля того, чтобы завершить разработку приложения, понадобится добавить функцию удаления записей. У нас предусмотрены ссылки для удаления альбомов напротив каждого элемента в списке. Первое приходящее на ум решение — удалять записи сразу при клике по одной из этих ссылок. Но это неправильный подход. Вспомните, что согласно спецификации HTTP, не следует выполнять необратимых действий с помощью метода GET. В таких случаях рекомендуется применять POST. Примером того может быть работа Google Accelerator.Мы должны запрашивать подтверждение перед удалением записей и удалять их только после того, как оно будет получено. Код, реализующий эти действия, в некоторой степени похож на уже существующие в нашем приложении функции-действия: zf-tutorial/application/controllers/IndexController.php:
Использован тот же способ определения метода обращения к скрипту и выбора требуемой операции (удаления записи или выдачи формы подтверждения). Точно так же, как в случае с добавлением и редактированием, удаление выполняется через Zend_Db_Table методом delete(). В конце функции
выполняется перенаправление пользователя на страницу со списком альбомов. Таким
образом, если одна из проверок корректности параметров не пройдена, происходит
возврат на исходную страницу без помощи многократного обращения к
_redirect() внутри функции.Шаблон представляет собой простую форму: zf-tutorial/application/views/scripts/index/delete.phtml:
Устранение неполадокЕсли возникают сложности при обращении к любым действиям помимоindex/index,
скорее всего причина состоит в том, что класс-роутер не может корректно
определить, в какой директории находится ваш веб-сайт. Такая ситуация может
возникнуть, если URL сайта не соответствует пути к его директории относительно
корневого каталога, открытого для доступа из сети.Если приведенный выше код не соответствует вашему случаю, необходимо задать переменной $baseURL корректное для вашего сервера значение:zf-tutorial/index.php:
Значение “ /mysubdir/zf-tutorial/” понадобится заменить на
действительный путь к файлу index.php. Например, если ваш URL к
index.php выглядит как http://localhost/~ralle/zf-tutorial/index.php,
корректным значением для переменной $baseUrl будет “/~ralle/zf-tutorial/”.ЗаключениеНа этом построение простого но полнофункционального MVC-приложения можно считать завершенным. Надеюсь, этот обзор был полезен и информативен для вас. Любые замечания к оригинальному тексту можно отправлять автору статьи по адресу rob@akrabat.com. Комментарии, связанные с русским переводом, отправляйте на musayev@yandex.ru.В данной статье выполнен лишь поверхностный обзор Zend Framework, в котором существует великое множество других классов, помимо перечисленных здесь. Для подробного ознакомления с ними следует обратиться к соответствующим ресурсам:
При переводе использовались материалы свободной энциклопедии Wikipedia.org. Данный перевод может быть найден по постоянному адресу: http://archive.paradigm.ru/zend-fw-intro… Оригинал статьи на английском доступен на сайте автора: http://akrabat.com/zend-framework-tutori… Update: Примеры из статьи на сайте автора: zf-tutorial_130.zip. Рубрика: PHP
О том как разработчики пьют кофе.
Сегодня ночью вернулся из Москвы, где я посетил сразу три конференции — SQA, PM Days и PHPconf. На конференции прозвучала масса интересных докладов, о которых наверняка еще не раз напишут, я же хочу поделиться некоторыми забавными наблюдениями. В перерывах между докладами все присутствующие могли выйти в холл, где их ожидали вкусные плюшки, молоко, чай и кофе. Для последнего на столах установили пять термосов. Разумеется для более чем двухсот участников конференции их было явно недостаточно и на каждой конференции эту проблему решали по своему, как умели.
Подробнее... |
Рубрика: Юмор
| Добавлено: 24.06.2008
Работаем с LINQ to XML.
Что же, попробуем раскрыть принципы работы этой новой технологии от Microsoft.
Подробнее... |
Рубрика: LINQ
| Добавлено: 24.06.2008
XmlSerializer - Assembly Leak без спроса.
В некоторых частях .NET Framework, таких как XmlSerializer, используется внутреннее динамическое создание кода.XmlSerializer создает временные файлы C#, компилирует результирующие файлы во временную сборку и затем загружает эту сборку в процесс. Такое создание кода тоже стоит сравнительно дорого, поэтому XmlSerializer размещает временные сборки в кэш, по одной на каждый тип. Это значит, что в следующий раз при создании кода XmlSerializer для класса Х не будет создаваться новая сборка, а будет использована сборка из кэша. Однако, не все так просто.
Подробнее... |
Рубрика: Сборки и развертывание
| Добавлено: 24.06.2008
Остальные статьи:
Реализация MVC в WPF. Александр Шер
ADO.NET Sync Services. Марат Бакиров
Рефакторинг JavaScript с применением Microsoft ASP.NET AJAX. Александр Шер
Архитектура приложений: интерфейс пользователя. Дмитрий Мартынов
Введение в Windows Workflow Foundation. Марат Бакиров
Создание расширяемых и удобных библиотек на платформе .NET. Особенности реализац...
Почему Ruby и Python не могут занять место стареющей Java
Использование пространств имен для организации JavaScript-кода
Создание сложных приложений в ExtJS
Google добавил интерфейс для AJAX-библиотек
Стивен Синофски о Windows 7
Несколько вещей об Ajax, которые должен знать веб-мастер
Model-View-Controller для JavaScript
Remix 2008: интернет меняет Microsoft
Планировщик задач на JavaScript
Построение систем автоматического протоколирования Си/Си++ кода |
Цитата дня (все,добавить): |
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|