Caution: You are browsing the legacy Logo of the legacy symfony 1 version 1.x part of this website.
This version of symfony is not maintained anymore. If some of your projects still use this version, consider upgrading.

Master Symfony fundamentals

Be trained by SensioLabs experts (2 to 6 day sessions -- French or English).
training.sensiolabs.com

Discover SensioLabs' Professional Business Solutions

Peruse our complete Symfony & PHP solutions catalog for your web development needs.
sensiolabs.com
Jobeet

Вступление

Фреймворк symfony был проектом с открытым исходным кодом (open source) более четырех лет и стал одним из наиболее популярных PHP фреймворков, благодаря своим огромным возможностям и прекрасной документации.

Эта книга описывает создание веб-приложения с использованием Symfony шаг за шагом - от спецификации до реализации. Она рассчитана на начинающих изучать Symfony, желающих разобраться, как это работает, и к тому же учит лучшим практикам разработки программного обеспечения.

Разрабатываемое приложение могло бы стать очередным движком для блогов. Но мы хотим использовать Symfony для более полезного проекта. Наша цель - продемонстрировать, что Symfony может быть использована для создания профессионального стильного веб-приложения путем минимальных затрат усилий.

Мы сохраним содержание проекта в секрете до следующего дня, поскольку сегодня нам и так предстоит много сделать. Однако, давайте озвучим имя: Jobeet.

Каждая глава этой книги потребует от 1 до 2 часов времени на изучение, и дает возможность изучать Symfony, разрабатывая реальный веб-сайт от начала и до конца. Каждый день к приложению будут добавляться новые возможности, и мы воспользуемся преимуществами такой разработки, чтобы познакомить Вас с новыми возможностями Symfony а также с лучшими практиками разработки на Symfony.

Эта книга не такая

Окунёмся в прошлое и вспомним php4. О-ла-ла, прекрасная эпоха! PHP был один из первых языков, направленных на веб и самым простым в изучении.

Но так как веб-технологии эволюционируют с каждым днём, веб-разрабочики должны быть близки к последним практическим вещам и инструментам. Самый лучший способ не отстать - читать блоги, учебники, книги. Мы уже достаточно прочитали всего этого, независимо от того, написаны ли они для PHP, Python, Java, Ruby или Perl, но многим из них очень не хватает примеров кода - их слишком уж мало.

Наверное вы читали подобное предупреждение:

"Не забудьте добавить валидацию и проверки на ошибки в реальном приложении."

или

"Безопасность отдаётся на личное изучение читателя"

или

"Конечно, Вам придётся писать тесты"

Что? Эти вещи Вам не игрушка. Да это, возможно, наиважнейшая часть всего исходного кода! И как читателя Вас оставляют наедине с собой. Без понимания данных принципов примеры куда более бесполезны. Их нельзя использовать как точку отсчёта. И это плохо! Почему? Потому что безопасность, валидация и управление ошибками, а так же тесты (и это ещё не всё) приведут Вас к верному коду!

В этой книге Вы никогда не увидите подобные изречения и мы будем писать тесты, обрабатывать ошибки, валидировать код и мы будем уверены в том, что создаём защищённое приложение. Symfony это не просто код, но ещё и отличная практика для тех, кто создаёт профессиональные веб-приложения для предприятий. Мы сможем предоставить наивысший комфорт, т.к. Symfony вобрал в себя все необходимые инструменты для программирования данных аспектов: легко и без создания тонн кода.

Валидация, управление ошибками, безопасность и тесты - это главные жители Symfony, так что у нас не уйдёт на объяснение всего этого много времени. Это лишь одна из многих причин, почему стоит использовать фреймворк для "живых" проектов.

Весь код, которые вы здесь увидите, вы можете использовать для реального проекта. Не бойтесь копировать и вставлять кусочки кода или воровать целые его цепочки.

Что у нас на сегодня?

Сегодня PHP код мы писать не будем. Но и без единой строки кода вы сможете уловить все прелести использования фреймворков, таких как Symfony, всего лишь развернув новый проект.

Целью этой главы является: создать среду разработки и отобразить страницу приложения в браузере. Это включает в себя установку Symfony, создание приложения и конфигурацию веб-сервера.

Поскольку эта книга сфокусирована на Symfony, мы будем рассчитывать, что Вы обладаете достаточными знаниями в PHP 5 и объектно-ориентированном программировании.

Требования

Прежде, чем устанавливать Symfony, Вам нужно убедиться, что все необходимое на Вашем компьютере установлено и настроено правильно. Потратье время на внимательное чтение этой главы и выполните все шаги, необходимые для проверки Вашей среды разработки, поскольку это может сэкономить Вам целый день в дальнейшем.

Дополнительное программное обеспечение

Прежде всего, Вам нужно убедиться, что Ваш компьютер содержит хорошо настроенную среду для веб-разработки. Как минимум, Вам нужен веб-сервер (например, Apache), СУБД (MySQL, PostgreSQL, SQLite или любая другая PDO-совместимая СУБД), и PHP 5.2.4 или выше.

Интерфейс командной строки

Symfony поставляется вместе с набором инструменов командной строки, которые автоматизируют для Вас много работы. Если Вы пользователь Unix-подобной ОС, Вы будете чувствовать себя, как дома. Если Вы используете Windows, все также будет замечательно работать, но Вам придется набирать некоторое количество команд в командном процессоре (cmd).

note

Консольные команды Unix могут весьма пригодиться в среде Windows. Если вы хотите использовать такие инструменты как tar, gzip или grep на Windows, то вы можете установить Cygwin. Исследователи так же могут попробовать Windows Services for Unix.

Настройка PHP

Поскольку настройка PHP может сильно отличаться для разных ОС, и даже для разных дистрибутивов Linux, Вам нужно убедиться, что конфигурация PHP удовлетворяет минимальным требованиям Symfony.

Для начала убедитесь, что у Вас установлено PHP как минимум версии 5.2.4, используя встроенную функцию phpinfo() или набрав php -v в командной строке. Имейте в виду, что Вы можете иметь 2 установленных версии PHP: одну для командной строки, и другую для веб.

Затем, скачайте скрипт, проверяющий, что конфигурации подходит для Symfony, по следующей ссылке:

http://sf-to.org/1.4/check.php

Сохраните скрипт где-нибудь в своей текущей корневой директории веб-сервера.

Запустите скрипт, проверяющий конфигурацию из командной строки:

$ php check_configuration.php

Если с Вашей конфигурацией PHP что-то не так, вывод команды даст Вам подсказку, что нужно исправить и как это сделать.

Также Вы должны запустить проверочный скрипт в браузере и исправить проблемы, которые он может обнаружить. Это нужно потому, что PHP может иметь уникальные конфигурационные файл php.ini для этих двух сред, имеющие разные настройки.

note

Не забудьте удалить проверочный скрипт из корневой директории веб-сервера после завершения.

Установка Symfony

Инициализация директории проекта

Прежде, чем инсталлировать Symfony, Вы сначала должны создать директорию, которая будет содержать все файлы, относящиеся к Jobeet:

$ mkdir -p /home/sfprojects/jobeet
$ cd /home/sfprojects/jobeet

Или на Windows:

c:\> mkdir c:\development\sfprojects\jobeet
c:\> cd c:\development\sfprojects\jobeet

note

Пользователям Windows рекомендуется устанавливать Symfony в папку, путь которой не содержит пробелов. Старайтесь не использовать папку Documents and Settings, а также папки типа My Documents

TIP: Если Вы создали директорию проекта Symfony в корневой директории веб-сервера, Вам не нужно дополнительно конфигурировать сервер. Конечно, для промышленного использования мы настоятельно рекомендуем Вам настроить свой веб-сервер, как описано в секции "Настройка веб-сервера: безопасный способ".

Выбор версии Symfony

Теперь Вам нужно установить Symfony. Поскольку Symfony имеет несколько стабильных релизов, Вам нужно выбрать один, который Вы хотите установить, прочитав страницу инсталляции на сайте Symfony.

Эта книга предполагает, что Вы выбрали Symfony 1.3 или Symfony 1.4.

Выбор инсталляционной директории Symfony

Вы можете установить Symfony на своей машине глобально, либо встраивать ее в каждый свой проект. Последний вариант предпочтительнее, поскольку тогда все Ваши проекты будут полностью независимы друг от друга. Обновляя локально установленную Symfony, Вы не нарушите неожиданно работу остальных своих приложений. Это означает, что Вы можете использовать в разных проектах разные версии Symfony и обновлять их по одной, если увидите в этом необходимость.

Поскольку это является лучшей практикой, многие разработчики устанавливают файлы Symfony в директорию lib/vendor своего проекта. Таким образом, для начала создайте эту директорию:

$ mkdir -p lib/vendor

Установка из архива

Самый простой способ установить Symfony - скачать архив выбранной Вами версии с сайта Symfony. Перейдите на страницу инсталляции для выбранной версии, например 1.4.

В секции "Source Download" Вы найдете архив в формате .tgz или .zip. Скачайте его, положите в свежесозданную директорию lib/vendor/, разархивируйте, и переименуйте появившуюся директорию в symfony:

$ cd lib/vendor
$ tar zxpf symfony-1.4.0.tgz
$ mv symfony-1.4.0 symfony
$ rm symfony-1.4.0.tgz

Под Windows распакуйте zip-файл, используя проводник Windows (Explorer). Когда Вы переименуете директорию в symfony, структура директорий будет примерно такой c:\dev\sfprojects\jobeet\lib\vendor\symfony.

Установка из Subversion (рекомендуемый вариант)

Если Вы используете Subversion, то лучший вариант - использовать свойство svn:externals, чтобы встроить Symfony в Ваш проект, в директорию lib/vendor/:

$ svn pe svn:externals lib/vendor/

note

Импорт Вашего проекта в новый репозиторий Subversion описывается в конце главы.

Если все сделано правильно, эта команда откроет Ваш любимый текстовый редактор, чтобы дать возможность настроить внешнюю ссылку Subversion.

tip

Под Windows Вы можете использовать интерфейс к Subversion, например TortoiseSVN, чтобы выполнять всю работу, не используя консоль.

Если Вы консервативны, свяжите свой проект с конкретным релизом (тэгом Subversion):

symfony http://svn.symfony-project.com/tags/RELEASE_1_4_0

Как только новый релиз будет анонсирован (см. Symfony blog), Вам нужно будет поменять URL на новую версию.

Если же Вы хотите находиться на переднем крае, используйте ветку 1.4:

symfony http://svn.symfony-project.com/branches/1.4/

Использование ветки дает Вашему проекту преимущество в использовании всех исправлений (bug fixes) автоматически, как только Вы запустите svn update.

Проверка правильности установки

Теперь, когда Symfony установлена, проверим, что все работает, используя командную строку Symfony для отображения текущей версии (обратите внимание на заглавную V):

$ cd ../..
$ php lib/vendor/symfony/data/bin/symfony -V

На Windows:

c:\> cd ..\..
c:\> php lib\vendor\symfony\data\bin\symfony -V

Опция -V также выводит путь к инсталляционной директории Symfony, которая хранится в файле config/ProjectConfiguration.class.php.

Если путь к Symfony абсолютный (чего не должно быть по умолчанию, если Вы следовали вышеприведенным инструкциям), измените его так, чтобы он выглядел примерно так (для обеспечения переносимости):

// config/ProjectConfiguration.class.php
require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';

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

tip

Если Вам не терпится узнать, что командная строка Symfony может сделать для Вас, наберите symfony, чтобы увидеть список всех доступных задач и опций:

$ php lib/vendor/symfony/data/bin/symfony

На Windows:

c:\> php lib\vendor\symfony\data\bin\symfony

Командная строка Symfony - это лучший друг разработчика. Она обеспечивает большое число утилит, для повышения продуктивности Ваший ежедневных действий, таких как очистка кэша, генерация кода и многое другое.

Настройка проекта

В Symfony, приложения (applications), использующие одну и ту же модель данных, группируются в проекты (projects). Для большинства проектов, у Вас будет два разных приложения: фронтэнд (frontend) и бэкэнд (backend).

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

Из директории sfprojects/jobeet запустите задачу Symfony generate:project, чтобы создать Symfony-проект:

$ php lib/vendor/symfony/data/bin/symfony generate:project jobeet

На Windows:

c:\> php lib\vendor\symfony\data\bin\symfony generate:project jobeet

Задача generate:project создаёт стандартную структуру каталогов и файлов, необходимых для проекта:

Директория Описание
apps/ Содержит все приложения проекта
cache/ Кэш фреймворка
config/ Конфигурационные файлы фреймворка
lib/ Библиотеки и классы проекта
log/ Логи фреймворка
plugins/ Установленные плагины
test/ Файлы для модульного и функционального тестирования
web/ Корневая папка с веб-файлами

note

Почему Symfony создаёт так много файлов? Главным преимуществом фреймворка является его стандартизация. Благодаря стандартной структуре файлов и папок Symfony, любой программист с небольшими знаниями по Symfony сможет осуществлять поддержку проекта. За считанные минуты он сможет погрузиться в код, начать править ошибки и добавлять новый функционал.

Задача generate:project так же создала ярлык symfony в корневом каталоге проекта для уменьшения количества символов, набираемых для запуска задачи.

Отныне, вместо того чтобы писать полный путь, мы будет пользоваться ярлыком symfony.

Создание приложения

Теперь создадим фронтэнд-приложение при помощи задачи generate:app:

$ php symfony generate:app frontend

tip

Так как файл symfony исполняемый, пользователи Unux могут заменить 'php symfony' на './symfony'

Под Windows вы можете скопировать файл 'symfony.bat' в свой проект и использовать 'symfony' вместо 'php symfony':

c:\> copy lib\vendor\symfony\data\bin\symfony.bat .

Ещё раз - задача generate:app создаёт стандартную файловую структуру для приложения, которое лежит в apps/frontend/:

Директория Описание
config/ Конфигурационные файлы приложения
lib/ Классы и библиотеки приложения
modules/ Код приложения (MVC)
templates/ Глобальные шаблоны приложения

sidebar

Безопасность (Security)

По умолчанию, задача generate:app создает приложение, защищенное от двух наиболее распространенных уязвимостей, которые можно найти в сети. Это правда - Symfony автоматически использует меры безопасности для нашей пользы.

Для предотвращения XSS-атак включается экранирование всего вывода; и для предотвращения CSRF-атак генерируется случайный секретный ключ.

Конечно, Вы можете управлять этими настройками, благодяря следующим опциям:

  • --escaping-strategy: Включает или отключает экранирование
  • --csrf-secret: Включает и отключает использование токенов уровня сессии в формах

Если вы ничего не слышали о XSS или CSRF, то советуем найти время и почитать о данных уязвимостях.

Права доступа к директориям

Прежде чем пытаться что-то делать со своим вновьсозданным проектом, Вам надо установить подходящий уровень прав на запись в директории cache/ и log/ так, чтобы Ваш веб-сервер мог писать в них:

$ chmod 777 cache/ log/

sidebar

Для тех, кто использует системы контроля версий

Symfony всегда пишет только в две директории Вашего проекта: cache/ и log/. Содержимое этих директорий должно быть исключено из контроля версий (например, при помощи свойства svn:ignore, если Вы используете Subversion).

Настройка веб-сервера: ужасный способ

Если Вы создали директорию проекта где-то в корневой веб-директории Вашего веб-сервера, Вы уже можете получить доступ к своему проекту из браузера.

Конечно, поскольку это не требует дополнительной настройки, это очень быстрый способ, но попробуйте открыть в браузере файл config/databases.yml, чтобы осознать весь вред от подобной лени. Если пользователь знает, что Ваш сайт разработан с использованием Symfony, он может получить доступ ко всем важным файлам, которые должны быть скрыты.

Никогда не используйте такой способ на промышленных серверах и прочитайте следующую секцию, чтобы узнать, как правильно настроить веб-сервер.

Настройка веб-сервера: безопасный способ

Хорошей практикой в веб является размещение в корневой директории веб-приложения только тех файлов, к которым нужен непосредственый доступ через браузер, например стилей (stylesheets), JavaScript-файлов и изображений. По умолчанию, мы рекомендуем хранить эти файлы в директории web/ Symfony-проекта.

Если Вы уже заглянули в данную директорию, то значит увидели некоторые подкаталоги для веб файлов, а так же 2 фронт-контроллера. Фронт-контроллеры - это единственные PHP-файлы, которые должны находиться в каталоге web. Все остальные PHP файлы должны быть скрыты от браузера для достижения ещё большей безопасности.

Конфигурируем веб-сервер

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

Найдите и откройте файл httpd.conf и добавьте в конце следующие строки:

# Убедитесь что эта строка отображается лишь однажды
NameVirtualHost 127.0.0.1:8080

# А это конфигурация Вашего проекта
Listen 127.0.0.1:8080

<VirtualHost 127.0.0.1:8080>
  DocumentRoot "/home/sfprojects/jobeet/web"
  DirectoryIndex index.php
  <Directory "/home/sfprojects/jobeet/web">
    AllowOverride All
    Allow from All
  </Directory>

  Alias /sf /home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf
  <Directory "/home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>

note

Алиас /sf даёт доступ к картинкам и javascript'ам необходимым для правильного отображения панели отладки.

На Windows, строку с директивой Alias стоит заменить чем-то вроде этого:

Alias /sf "c:\dev\sfprojects\jobeet\lib\vendor\symfony\data\web\sf"

/home/sfprojects/jobeet/web должно быть заменено на:

c:\dev\sfprojects\jobeet\web

Данная конфигурация позволяет слушать порт 8080 на Вашей машине, так что проект Jobeet будет доступен по адресу:

http://localhost:8080/

Вы можете заменить порт 8080 на любой другой, предпочительно больше 1024, т.к. на них не нужно никаких администраторских прав.

sidebar

Создаём специализированное доменное имя

Если вы администратор сервера, то лучше настроить виртуальные хосты, а не добавлять новый порт каждый раз, когда Вы начинаете новый проект. Вместо выбирания порта для директивы Listen подберите доменное имя (например, имя реального домена с добавлением .localhost в конце) для директивы ServerName:

# Это конфигурация Вашего проекта 
<VirtualHost 127.0.0.1:80>
  ServerName www.jobeet.com.localhost
  <!-- тот же конфиг что и раньше -->
</VirtualHost>

Доменное имя www.jobeet.com.localhost должно быть определено локально. Если вы работаете под Linux, то его нужно прописать в файл /etc/hosts. Windows XP использует для этого для этого директорию C:\WINDOWS\system32\drivers\etc\.

Пропишите следующее:

127.0.0.1         www.jobeet.com.localhost

Тестируем новую конфигурацию

Перезагрузите Apache и проверьте доступ к вашему приложению, открыв в браузере http://localhost:8080/index.php/ или http://www.jobeet.com.localhost/index.php/, в зависимости от того, какую конфигурацию Apache Вы выбрали.

Поздравляем

note

Если у Вас установлен модуль mod_rewrite Вы можете удалить /index.php/ из ссылок, данных выше.

Так же стоит проверить работоспособность окружения разработки (смотрите следующую секцию для получения сведений об окружениях). Используйте следующую ссылку:

http://jobeet.localhost/frontend_dev.php/

В правом верхнем углу должна показаться панель отладки, на которой размещены маленькие иконки. Это доказывает что алиас sf/ работает отлично.

Панель отладки

note

Установка на сервер IIS под Windows несколько отличается. Способ установки можно найти в этом уроке.

Окружения (environments)

Если Вы заглянете в директорию web/, Вы найдете два PHP-файла: index.php и frontend_dev.php. Эти файлы называются фронт- контроллерами; все запросы к приложению проходят через них. Но почему мы должны иметь два фронт-контроллера для каждого приложения?

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

  • Окружение разработки: Используется веб-разработчиками, когда они работают над приложением, чтобы добавить новый функционал, исправить ошибки и т.д.

  • Тестовое окружение: Используется для запуска автоматизированных тестов приложения.

  • Демонстрационное (staging) окружение: Используется заказчиком для поиска ошибок и недоделок.

  • Промышленное (production) окружение: Используется конечными пользователями.

Что делает окружение уникальным? К примеру в окружении разработки, приложение должно логгировать все детали запроса для облегчения отладки, а система кэширования должна быть отключена, чтобы все сделанные в коде изменения, сразу же были видны. Т.о., окружение разработки должно быть оптимальным для разработчика. Лучшей иллюстрацией будет ситуация возникновения исключения. Чтобы помочь разработчику быстрее понять, что произошло, Symfony отображает всю информацию об исключении и текущих параметрах запроса прямо в браузере:

Исключение в окружении разработки

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

Исключение в промышленном окружении

tip

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

// web/index.php
<?php
 
require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');
 
$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false);
sfContext::createInstance($configuration)->dispatch();

Панель отладки тоже является хорошим примером использования разных окружений. Она присутствует на всех страницах в окружении разработки и дает Вам доступ к большому количеству информации при помощи кликов по различным иконкам: текущая конфигурация приложения, логи текущего запроса, SQL-запросы, выполненные в базе данных, используемая память, время загрузки страницы.

Subversion

Хорошим тоном является использование контроля версий при создании веб-приложений. Использование контроля версий даёт нам:

  • быструю разработку,
  • возврат к предыдущей версии, если что-то поломалось,
  • эффективную работу команды разрабочиков,
  • доступ ко всем удачным версиям приложения.

В данной секции мы расскажем как пользоваться Subversion. Если Вы используете другой инструмент контроля версий, то будет весьма легко адаптироваться под Subversion.

Мы надеемся, что у вас уже есть доступ к репозиторию Subversion.

tip

Если у Вас ещё нет в распоряжении репозитория Subversion, то вы можете воспользоваться одним из таких на Google Code или просто погуглить "free subversion repository".

Для начала создадим репозиторий для проекта jobeet:

$ svnadmin create /path/to/jobeet/repository

На Вашей машине создайте базовую структуру директорийЖ $ svn mkdir -m "created default directory structure" http://svn.example.com/jobeet/trunk http://svn.example.com/jobeet/tags http://svn.example.com/jobeet/branches

Затем выгрузите из репозитория пустую директорию trunk/:

$ cd /home/sfprojects/jobeet
$ svn co http://svn.example.com/jobeet/trunk/ .

Затем удалите всё из cache/ и log/ - их содержимое нам в репозитории не нужно.

$ rm -rf cache/* log/*

Теперь убедитесь, что права на cache и log стоят нужные - веб-сервер должен в них свободно писать:

$ chmod 777 cache/ log/

Итак, делаем первый импорт: $ svn add *

Т.к. файлы из cache/ and /log нам не нужны, стоит прописать игнорирование:

$ svn propedit svn:ignore cache

Должен запуститься текстовый редактор, настроенный на работу с svn. Subversion должен игнорировать любой контент в данном каталоге:

*

Сохраняемся и закрываем. Вот и всё.

Повторите процедуру для каталога log/:

$ svn propedit svn:ignore log

И введите:

*

И теперь отправим изменения в репозиторий:

$ svn commit -m "added cache/ and log/ content in the ignore list"

tip

Пользователи Windows могут использовать замечательный клиент TortoiseSVN для управления своим репозиторием.

Увидимся завтра!

Прекрасно, на сегодня все! Даже не смотря на то, что мы еще не начали толком говорить о Symfony, мы настроили мощное окружение разработки, мы поговорили о лучших практиках веб-разработки, и мы готовы начать программировать.

Завтра мы раскроем, что же должно делать наше приложение и поговорим о требованиях, которые нам нужно реализовать для Jobeet.