Symfony и задача генерации кода (scaffolding)

Каждый сайт стремится отличаться от других своим дизайном или наполнением или еще чем-то. При этом большинство систем управления сайтом содержат одинаковые модули – блоки новостей, статей, галереи, различные каталоги и пр. Данные этих модулей, как правило, хранятся в базе данных, а система управления сайта предоставляет удобоваримый интерфейс для редактирования этих данных. При этом специфика сайта накладывает определенные условия на эти модули. Одни модули могут иметь совершенно одинаковую структуру на разных сайтах. Так, например, модуль новостей для большого числа сайтов имеет одинаковую структуру. А другие, могут различаться лишь незначительно. Например, для каталога сайта test.ru требуется одно изображение и 5 текстовых полей характеристик, а для какого-нибудь test2.ru уже 7 текстовых полей и 2 изображения. Таким образом, для создания модуля управления каталогом на этих сайтах нужно продублировать практически один и тот же кусок кода как при отображении формы, так и при обработке присылаемых данных.

Стоит уточнить, что речь идет не о простых сайтах, содержащих несколько статей, блок новостей и что-нибудь еще не менее «стандартное». Для них, конечно же, можно использовать систему управления сайта из числа универсальных CMS, представленных в огромном количестве в сети. Но настроек и набора модулей такой CMS далеко не всегда хватает для создания сайтов посложнее, предъявляющих какие-нибудь специфические требования. При этом, доработка такой CMS не всегда оправдывает затраченные на её изучение и модификацию средства.

Другой выход – написание собственной системы управления сайтом, которая будет учитывать все нюансы и специфику проекта. И было б замечательно, если можно было бы создать свою систему, или хотя бы её прототип, по описанию модели данных проекта. Ведь операции, которые выполняет обычная «админка» с данными,  одинаковы: это создание, получение, обновление и удаление данных. Разница заключается лишь в структуре данных различных модулей.

Поставленную задачу по генерации года (или scaffolding) с легкостью выполняет свободно распространяемый фреймворк symfony. Процесс генерации кода осуществляется поэтапно. На первом этапе генерируется объектная модель на основе модели данных или существующей структуры БД. На выходе формируются классы, которые позволяют программисту «забыть» SQL-язык и таблицы в БД. Например, у нас есть таблица новостей, и мы хотим получить новость с id=1. Используя стандартные средства, мы бы написали что-то вроде:

$result = mysql_query("SELECT * FROM news WHERE id = 1");
if ($result) {
$row = mysql_fetch_assoc($result);
echo $row["message"];
}

Объектная модель, сгенерированная фреймворком, позволяет получить новость следующим образом:

$news = NewsPeer::retrieveByPk(1);
echo $news->message;

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

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