На момент написания статьи, использовалась версия Zend Framework 1.11.4

Мы познакомимся с Zend Framework, а именно:

  • Установим и сконфигурируем все необходимые инструменты (Zend Tool, настроим виртуальный Host);
  • Определимся с проектом, который будем реализовывать;
  • Познакомимся с концепцией MVC;

Что необходимо для функционирования Zend Framework:

  • PHP 5.2.4 (или любая более новая версия);
  • Веб-сервер с поддержкой mod_rewrite или аналога рерайтинга и поддержкой .htacces
  • База данных MySQL

Чтоб не тратить лишнего времени, воспользуемся готовым джентельменским набором XAMPP.  установим его в конфигурации по умолчанию.

Установка Zend Framework и Zend Tool

1. Скачиваем последнюю версию Zend Framework

  • Скачайте последнюю версию пакета Zend Framework 1.11.X Full;
  • Извлекаем из всё содержимое архива;

2. Переносим содержимое архива

  • Копируем разархивированную папку в каталог C:xamppZendFramework;
  • Если вы всё сделали правильно, то по данному адресу C:xamppZendFramework у вас должны располагаться такие каталоги: bin, demos, externals, extras, libraries и т.д.

3. Конфигурируем Zend Tool

  • Нажмите правый клик на иконке «Компьютер» в панели пуск (Windows 7) и выберите пункт «Свойства».
  • В левой части панели выберите пункт «Дополнительны параметры системы».
  • В открывшемся окне нажмите кнопку «переменные среды».
  • Далее в списке системные переменные, ищем переменную Path и делаем на ней двойной клик. Перед вами должно открыться следующее окно.

  • Нажимаем на содержимое поля «значение переменной», перемещаемся в конец строки;
  • Ставим точку с запятой ";" (без кавычек);
  • Далее вписываем адрес C:xamppZendFrameworkbin;
  • Жмём OK;
  • После этого не помешает перезагрузить компьютер, чтобы все изменения нормально встали.

4. Проверка работы Zend Tool

  • Откройте командную строку. Нажмите клавиши Windows->R. В открывшемся окне наберите команду cmd;
  • В командой строке наберите zf и нажмите Enter. После этого перед вами появится список всевозможных команд, некоторые из которых мы рассмотрим далее. Если этого не произошло, значить вы неверно сконфигурировали Zend Tool.

5. Прописываем Zend Frameword в php.ini

  • Откройте файл php.ini
  • Найдите строку include_path
  • Впишите следующее содержание:
    ; Zend Framework
    include_path = ".;
    C:xamppZendFrameworklibrary"
  • Перезапустите Apache

Вот и всё. Мы только что установили Zend Framework, сконфигурировали Zend Tool и готовы приступить к созданию нашего нового проекта.

Проектируем приложение

Для демонстрации концепции Zend Framework продемонстрируем его работу на небольшом примере. Создадим картотеку любимых фильмов.

Так же нам понадобятся следующие страницы:

  • Главная - на которой будет отображать список фильмов
  • Добавление записи -  страница, содержащая форму добавления нового фильма
  • Редактирование записи - страница редактирования фильма
  • Удаление записи - удаление фильма из БД

Создание проекта

Откройте терминал или консоль и перейдите в каталог, который является корнем вашего сайта (root папку). В моём случае это C:xamppapachehtdocs. Если вы являетесь обладателем Linux или его дистрибутивов, до и после создания проекта убедитесь, что для вашего пользователя и web сервера были выставлены права на запись.

zf create project zfdemo

Если теперь вы посмотрите на содержимое корневого каталога сайта, то уведете множество папок и файлов, которые были созданы инструментом Zend Tool. Этот на первый взгляд хаос является структурой Zend Framework проекта. Без Zend Tool вам бы пришлось создавать всё это руками.

Папка application это ядро нашего будущего сайта. Там будут располагаться все коды, отвечающие за работу web-приложения. В каталоге application вы найдёте другие папки концепция которых уже давно на слуху: controllers, models, views.

Каталог public это корень вашего сайта, а это значит, что нам необходимо создать виртуальный хост, в настройках которого будет указано, что каталог public является корневым. Так же в каталоге public будут содержаться все изображения, javascript скрипты, css стили и прочие файлы.

Папка library может содержать саму библиотеку Zend, но не только. Туда можно закидывать любые другие библиотеки, которые могут понадобиться вам при разработке вашего сайта.

Все остальные каталоги будем рассматривать по мере надобности.

Настройка веб-сервера

 Чтобы активировать поддержку .htaccess, в конфигурационном файле Apache httpd.conf, строку AllowOverride None, необходимо заменить на AllowOverride All)

Кроме того, настроим виртуальный хост для работы нашего проекта:

  1. Откройте конфигурационный файл Apache httpd.conf.
  2. Уберите комментарий со строки со следующим содержанием: Include conf/extra/httpd-vhosts.conf
  3. Если вы находитесь в каталоге conf, перейдите в каталог extra и откройте файл httpd-vhosts.conf
  4. Внесите в файл httpd-vhosts.conf следующие строки и сохраните файл:



   DocumentRoot "C:/xampp/apache/htdocs/zfdemo/public"
   ServerName zfdemo.web
   SetEnv APPLICATION_ENV development   
  
       Options Indexes MultiViews FollowSymLinks
       AllowOverride All
       Order allow,deny
       Allow from all
  

После перезапуска Apache наш сайт должен быть доступен по адресу www.zfdemo.web

Если вы не увидите следующей картинки, то значит, что что-то не так с путями или правами:

Пару слов о средах разработки

Теперь я бы хотел пояснить строку SetEnv APPLICATION_ENV development, которую мы вписали в наш виртуальный хост.

Среды разработки предназначены для того, чтобы организовать работу в команде или просто обеспечить удобную работу над созданием Zend приложения. Каким образом? Допустим у вас имеется хостинг, где есть база данных с названием hostdb, пользователем hostdbuser, и паролем hostdbuserpass. А на локальной машине у вас база homedb, пользователь hostdbuser и пароль hostdbuserpass. Для того чтобы Zend приложение понимало откуда брать данные автоматически когда оно запускается на локалке или на сервере необходимы среды разработки. По умолчанию в Zend Framework 3 среды. production, staging и development (хотя мы можем создавать и свои собственные). Если вы внимательно посмотрите в содержание application.ini то увидите записи следующего вида:

[development : production].

Это означает, что среда разработки development наследуются от среды разработки production (которая в каждом Zend проекте запускается по умолчанию). Значит, если production запускается по умолчанию, то целесообразно разместить данные для подключени к БД от сервера именно в эту секцию, а от домашнего в секцию development. Что при этом происходит:

Вариант 1. На локальном хосте

  1. Zend приложение загружается, ищет среду разработки.
  2. Виртуальныей хост, который мы настроили говорит, что среда разработки development.
  3. Zend подгружает секцию development, где находятся данные для работы с локальной БД

Вариант 2. На хостинге

  1. Zend приложение загружается, ищет среду разработки - не находит.
  2. Zend по умолчанию определяет среду разработки production.
  3. Zend подгружает секцию production, где находятся данные для работы с БД на хостинге.

Теперь мы можем двигаться дальше.

Знакомимся с контроллерами, экшенами и вью

Контроллеры - это специальные классы со строгим правилом наименования. Тут вообще всё очень строго и сурово. К примеру имя контроллера должно быть составлено следующим образом: {Имя_контроллера}Controller. К примеру: IndexController, ErrorController, UserController и т.д. Название контроллера должно начинаться с заглавной буквы. Все контроллеры должны располагаться в папке application/controllers.

Каждый контроллер включает в себя набор действий или другими словами actions. Action это функция с модификатором доступа public, которая представляет собой страницы вашего сайта. Именуются они тоже строго: {имя_действия}Action. К примеру indexAction(), printAction() и т.д. Название действия начинается с прописной буквы!

Давайте экспериментировать:

Зайдите в папку application/controllers. Внутри этой папки должно быть 2 файла. IndexController и ErrorController. Эти контроллеры были сформированы когда вы создавали проект при помощи Zend Tool. Откройте IndexController.


class IndexController extends Zend_Controller_Action
{
    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        // action body
    }
}
?>

 

Мы видим, что в IndexController есть 2 метода: _init() и indexAction. Функция init вызывается каждый раз при запуске контроллера. indexAction() это функция представляющая из себя страницу сайта. Чтобы убедиться в этом внесите в функцию indexAction следующую строку:

echo "Я в IndexController, в indexAction!!!"

Чтобы достучаться до этого action пройдите по адресу http://zfdemo.web/index/index. Данная запись означает, что мы обращаемся к контроллеру index и действию index. Но помимо нашей строки вы видите ещё какой-то материал. Это происходит потому что у каждого action есть свой view (или представление).

Пройдите в папку application/views/scripts/index и откройте файл index.phtml

В этом файле находится всё то, что вы видите на странице. Удалите всё содержимое файла index.phtml и перезагрузите страницу http://zfdemo.web/index/index или просто http://zfdemo.web/index/ т.к. indexAction запускается по умолчанию. Теперь на странице должно быть только наше сообщение “Я в IndexController, в indexAction!!!”

Общая концепция работы по схеме Model-View-Controller:

  1. Контроллер вызывает модель;
  2. Модель вытаскивает данные из базы и возвращает в контроллер;
  3. Контроллер обрабатывает полученные данные и передаёт в view (представление);
  4. Представление выводит все данные;

Для того чтобы реализовать наш проект нам необходимо создать несколько action.

Создание Actions

Откройте консоль или терминал и пройдите в папку, где содержится ваш сайт (Обязательно именно в эту папку). В нашем случае это C:/xampp/apache/htdocs/zfdemo.

Набирайте команды:

zf create action add index
zf create action edit index
zf create action delete index

Таким нехитрым способом мы создаем action с именем add в контроллере index и т.д.

Помимо добавления записей в IndexController.php Zend Tool так же создаст для вас необходимые view каталоги и файлы. Можете убедиться в этом сами. Теперь вы можете обращаться к этим страницам по адресам:

http://zfdemo.web/index/add,
http://zfdemo.web/index/edit,
http://zfdemo.web/index/delete

Если вы всё сделали правильно, то теперь у вас должен быть настроен Zend проект

Создадим базу данных

Будем думать, что раз уж вы дошли до этого места - создать базу данных MySQL для вас не проблема.

На всякий случай скажу, что XAMPP располагает MySQL по следующему адресу:

C:>c:/xampp/mysql/bin/mysql -u root -p
Enter password:

Вводим пустой пароль (т.е. просто жмем enter). Да, пустой рутовый пароль - это моветон, но мы и не говорим о production версии.

MySQL покажет следующее сообщение:

Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 73
Server version: 5.5.8 MySQL Community Server (GPL)
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

Далее вводим наш SQL запрос на создание таблицы:

mysql> CREATE DATABASE  `zfdemo` ;USE `zfdemo` ;CREATE TABLE IF NOT EXISTS `movies` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `director` varchar(100) NOT NULL,
 `title` varchar(100) NOT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;INSERT INTO `movies` (`id`, `director`, `title`) VALU
ES(1, 'Питер Джексон', 'Властелин Колец'),(2, 'Кристофер Нолан', 'Начало'),(3, 'Тодд Филлипс', 'Мальчишник в Вегасе'),(4, 'Кристофер Нолан', 'Темный рыцарь'),(5, 'Эндрю Стентон', 'ВАЛЛ-И');

В ответ на что получаем:

Query OK, 1 row affected (0.00 sec)

Database changed
Query OK, 0 rows affected (0.01 sec)

Для подключения к базе данных вы обычно пользовались отдельным файлом config.php или db.php, а в Zend Framework для этих целей существует отдельный файл - application.ini, который находится в каталоге вашего проекта zfdemo/application/configs/application.ini. Перейдите в сегмент development ([development : production]) и вставьте следующий код:

resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.username = root
resources.db.params.password = sql4root
resources.db.params.dbname = zfdemo

PDO_MYSQL – это адаптер (драйвер), который мы будем использовать для работы с базами данных. Перечисленные параметры - это хост, логин пользователя, его пароль и имя базы данных, к которой будем подключаться.

Теперь для того чтобы взаимодействовать с только что созданной таблицей, нам необходимо создать модель. Сделаем мы это при помощи Zend Tool. Откройте консоль или командную строку. Перейдите в каталог вашего проекта (обязательно). Теперь наберите команду:

c/:xampp/apache/htdocs/zfdemo>zf create db-table Movies movies
Creating a DbTable at C:xamppapachehtdocszfdemo/application/models/DbTable/Movies.php
Updating project profile 'C:xamppapachehtdocszfdemo/.zfproject.xml'

После того как вы выполните данную операцию, у вас будет создан новый каталог (application/models/DbTable) и файл Movies.php.

Откройте данный файл и заполните его следующим содержимым:

 


class Application_Model_DbTable_Movies extends Zend_Db_Table_Abstract
{
    // Имя таблицы, с которой будем работать
    protected $_name = 'movies';
    
    // Метод для получения записи по id
    public function getMovie($id)
    {
        // Получаем id как параметр
        $id = (int)$id;

        // Используем метод fetchRow для получения записи из базы.
        // В скобках указываем условие выборки (привычное для вас where)
        $row = $this->fetchRow('id = ' . $id);

        // Если результат пустой, выкидываем исключение
        if(!$row) {
            throw new Exception("Нет записи с id - $id");
        }
        // Возвращаем результат, упакованный в массив
        return $row->toArray();
    }
    
    // Метод для добавление новой записи
    public function addMovie($director, $title)
    {
        // Формируем массив вставляемых значений
        $data = array(
            'director' => $director,
            'title' => $title,
        );
        
        // Используем метод insert для вставки записи в базу
        $this->insert($data);
    }
    
    // Метод для обновления записи
    public  function updateMovie($id, $director, $title)
    {
        // Формируем массив значений
        $data = array(
            'director' => $director,
            'title' => $title,
        );
        
        // Используем метод update для обновления записи
        // В скобках указываем условие обновления (привычное для вас where)
        $this->update($data, 'id = ' . (int)$id);
    }
    
    // Метод для удаления записи
    public function deleteMovie($id)
    {
        // В скобках указываем условие удаления (привычное для вас where)
        $this->delete('id = ' . (int)$id);
    }
}

 

Мы только что создали модель с очень длинным названием Application_Model_DbTable_Movies. Такое наименование необходимо согласно правилам построения проекта. Дело в том, что когда мы будем создавать объект данной модели, Zend Framework должен определить какой файл ему подключить. Данное название класса говорит о том, что модель находится в каталоге application/models/db-table, а сама модель называется Movies.php. Таким образом, Zend Framework автоматически подключит данную модель.

Если вы обратили внимание, то наша модель наследуется от класса Zend_Db_Table_Abstract. Благодаря этому наследованию мы можем пользоваться методами insert(), update(), delete(), fetchRow(), fetchAll() и многими другими.

Теперь, когда всё необходимое для работы с базой данных готово, приступим к созданию layout.

Создание layout

Как вы уже поняли из первой статьи, у каждого контроллера есть серия своих action, каждый из которых в свою очередь имеет свой view. Если вы откроете какой-то view, допустим applicationviewsscriptsindexedit.phtml, то не увидите ни doctype, ни meta тегов… Вы спросите: «Что мне в каждом файле писать doctype?». Ответ - конечно же нет! Для этого в Zend Framework существует Layout.

Откройте консоль или командную строки и перейдите в каталог вашего проекта. Для того чтобы создать layout, наберите следующую команду:

zf enable layout

После выполнения данной команды в вашем application.ini появится новая строка:

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

Ниже этой строки добавьте следующую запись, которая сообщит приложению какой использовать doctype:

resources.view.doctype = "XHTML1_STRICT"

Первая строка сообщит Zend Framework, где ему искать layout скрипт. Откройте каталог application/layouts/scripts. В данной папке вы увидите файл layout.phtml. Откройте данный файл и вставьте следующее содержание: