Caution: You are browsing the legacy 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
Blackfire Profiler Fire up your PHP Apps Performance

PHP Project Quality Done Right
Jobeet

Вступление

Фреймворк symfony был Open-Source проектом на протяжении трёх лет и стал одним из самых популярных фреймворков, благодаря своим возможностям и великолепной документации. Эта традиция зародилась давным-давно.

В декабре 2005, сразу после первого официального релиза symfony, мы опубликовали учебник Askeet, набор из 24 уроков, публикуемых ежедневно между началом декабря и рождеством.

Данный учебник стал бесценным инструментом для донесения фреймворка новым адептам. Огромное количество разработчиков научились работать с symfony благодапя askeet, и до сих пор большинство компаний используют askeet как учебный материал.

Мы празднуем выход symfony 1.2 и учебник askeet стал уже староват. Пришло время для нового, свежего учебника!.

Знакомьтесь, Jobeet, учебник-календарь 2008!

Вызов

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

24 раза по одному часу - это одни полные сутки, и это тот максимум, который, как мы считаем нужно потратить на изучений основ symfony. Каждый день бы будем добавлять новые вещи в наше приложение. Мы также познакомим вас с новыми функциями symfony и дадим хорошую практику для веб-разрабочика.

В askeet 21ый день был "найми-гуру-симфони-на-день". В этот день ничего не планировалось и мы лишь принимали предложения по внесению различных фич в askeet. Это был успех, и сообщество решило, что нам нужен поисковый движок в данном приложении И мы его сделали. День 21 учебника был одним из самых популярных.

А в Jobeet, мы будем праздновать на 21ый день зимы "День дизайнера". После четвёртого дня, у вас буде вся необходимая информция по HTML и CSS и вы сможете создать дизайн для публичного релиза Jobeet. Так что, если вы работаете дизайнером и ваша компании имеет отдел дизайна, то мы сможете поделиться с нами дизайном. В 21ый день, мы создадим опросник и сообщество должно будет определить стандартный дизайн, с которым будет поставляться Jobeet. Конечно же вас внесут в список разрабочиков и получите славу!

А этот учебник какой-то не такой

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

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

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

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

или

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

или

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

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

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

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

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

The Проджект

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

Содрежимое следующего дня оставим пока в тайне. Сегодя у нас и так много дел. Тем не менее вы уже знакомы с именем приложения: Jobeet.

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

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

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

Требования

Для начала убедитесь, что у вас уже есть готовая среда для разработки с веб-сервером (например Apache), базой данных (MySQL, PostgreSQL, или SQLite) и PHP 5.2.4 или позднее на борту.

Раз нам придётся часто использовать командную строку, то лучше использовать Unix-like ОС, но если вы работаете под Windows - всё будет работать отлично, просто придётся ввести несколько команд в cmd.

note

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

Так как данный учебник по большей части фокусируется на фреймворке symfony, то мы смеем предположить что у вас уже есть базовые знания по PHP и Объекто-ориентированному программированию

Установка 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

Создайте каталог, в которой будут храниться библиотечные файлы symfony:

$ mkdir -p lib/vendor

Чтобы установить Symfony скачайте архив, лежащий на сайте symfony. Раз данный учебник написан под symfony 1.2, то стоит скачать самую свежую стабильную версию.

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

$ cd lib/vendor
$ tar zxpf symfony-1.2-latest.tgz
$ mv symfony-1.2.0 symfony

Под Windows разарзивация может быть сделана через обозреватель. После того как вы переименуете каталог в symfony, там вы должны будете увидеть c:\development\sfprojects\jobeet\lib\vendor\symfony.

Конфигурация php может отличаться в различных дистрибутивах, поэтому нам необходимо быть уверенным, что конфигурация PHP имеет необходимые минимальные требование symfony. Запустите проверку конфигурации при помощи скрипта, поставляемым с symfony:

$ cd ../..
$ php lib/vendor/symfony/data/bin/check_configuration.php

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

Configuration check

Проверьте правильность установки symfony через командную строку (обратите внимание на заглавную V):

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

На Windows:

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

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

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

Под Windows:

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

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

Project Setup

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

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

Из каталога jobeet запустите symfony задачу generate:project, для того чтобы создать проект:

$ 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 в корневом каталоге проекта Jobeet для уменьшения количества символов, набираемых для запуска задачи.

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

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

Теперь создадим frontend приложения при помощи задачи generate:app:

$ php symfony generate:app --escaping-strategy=on --csrf-secret=Unique$ecret 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/ Глобальные шаблоны приложения

tip

Все комнады symfony должны исполнятся в каталоге с проектом, пока не было сказано обратное.

Вызывая задачу generate:app мы применили 2 опции:

  • --escaping-strategy: предотвращаем XSS атаки
  • --csrf-secret: использует ключи сессии для предотвращения CSRF атак

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

note

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

Путь к symfony

Вы можете узнать текущую версию symfony набрав:

$ php symfony -V

Опция -V так же отобразит путь к установленной symfony, который можно так же найти в config/ProjectConfiguration.class.php:

// config/ProjectConfiguration.class.php
require_once '/Users/fabien/work/symfony/dev/1.2/lib/autoload/sfCoreAutoload.class.php';

Для большей совместимости замените абсолютный путь на относительный:

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

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

Окружения

Если вы загляните в папку web/, то там обнаружите 2 PHP файла: index.php и frontend_dev.php. Это так называемые фронт-контроллеры (front controllers): все запросы к приложению идут через них. Но почему же у нас 2 фронт-контроллера? Приложение-то мы создавали одно!

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

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

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

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

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

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

Окружение symfony - это уникальный набор настроек и они встроены в наше фреймворк:dev, test и prod.

Если вы взглянете в код фронт-контроллера, то вы увидите разницу настроек окружений:

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

note

Определение нового окружения делается так же легко, как и создание нового фронт-контроллера. Позже мы узнаем, как же поменять настройки окружения.

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

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

Конечно, когда конфигов нет, то и устанавливать проще. Но давайте всё таки откроем файл config/databases.yml в вашем браузере, чтобы понять суть всей хреновости такой вещи как лень.

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

Настройка сервера: Безопасный путь

Хорошим тоном будет держать в открытом доступе только те файлы, которые нужны браузер: стили, JavaScript'ы или картинки. А так же мы рекомендуем держать данные файлы в под-директориях каталога web.

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

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

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

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

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

# А это конфигурация Jobeet
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:\development\sfprojects\jobeet\lib\vendor\symfony\data\web\sf"

/home/sfprojects/jobeet/web should be replaced with:

c:\development\sfprojects\jobeet\web

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

http://localhost:8080/

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

sidebar

Создаём доменное имя для Jobeet

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

# This is the configuration for Jobeet
<VirtualHost 127.0.0.1:80>
  ServerName jobeet.localhost
  <!-- тот же конфиг что и раньше -->
</VirtualHost>

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

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

127.0.0.1         jobeet.localhost

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

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

Поздравляем

note

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

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

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

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

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

note

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

Subversion

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

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

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

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

tip

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

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

$ svnadmin create http://svn.example.com/jobeet
$ 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

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

$ cd /home/sfprojects/jobeet
$ rm -rf cache/*
$ rm -rf log/*

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

$ chmod 777 cache
$ chmod 777 log

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

$ svn import -m "made the initial import" . http://svn.example.com/jobeet/trunk

Т.к. файлы из 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 для управления своим репозиторием.

note

SVN репозиторий Jobeet будет с каждым днём будет доступней.

И хотя пока ещё не весть репозитарий доступен (http://svn.jobeet.org/), сегодняшний код был выложет и теггирован.

Вы можете проверить release_day_01:

  $ svn co http://svn.jobeet.org/tags/release_day_01/ jobeet/

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

Ну что же, на сегодня всё! Хотя мы даже ещё и начали говорить про symfony, мы создали крепкую среду для разработки, мы поговорили о лучших вещах веб-разработки и готовы программировать.

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

Ждём вас завтра!