Askeet. День второй. Создание модели
Приветствуем!
Хотите что-то написать?Нужно назвать себя.
Если вы пришли в первый раз,
то нужно зарегистрироваться.
Переводы → Askeet. День второй. Создание модели
В предыдущих сериях...
Во время первого дня этого длинного но невероятно интересного учебника мы научились устанавливать фреймворк symfony, создавать новые приложения и среду разработки, а так же добавили безопасности коду, введя контроль версий. Кстати, код первого дня доступен в репозитории svn по адресу:
Целями второго дня являются: определение финального функционала результирующего приложения, наброски модели данных и начало программирования. Это вберёт в себя генерацию объекто-ориентированной карты и использование её интерактивности для создания, получение и обновления записей в базе данных в приложении.
Весьма объёмно. Поехали!
Совершенно секретно
Итак, что мы хотим знать? Интересный вопрос. Вообще интерсных вопросов много:
- Чем заняться вечером с подружкой?
- Как сгенить трафик в блоге
- Какой веб-фреймворк лучший?
- Какой самый известный ресторан в Париже?
- В чём смысл жизни? Откуда взялась вселенная и всё остальное?
На все эти вопросы нужен не просто ответ, а лучший ответ. Невероятно, но факт - вопросы, имеющий один ответ являются самыми неинтересными (вроде "сколько будет 1+1") и лишь немногие удостоены награды быть решёнными в вебе. Так нечестно.
Познакомтесь - "Спросика". Сайт, направленный для получения ответов на вопросы. Кто будет отвечать на эти дурацкие вопросы? Да все! И все смогут ставить оценки за ответы, а самый лучший ответ будет лучше виден. Так как количество вопросов растёт, то нереально будет всё хранить в обычных каталогах и подкаталогах, поэтому задающий вопрос сможет ставить метки из любых слов, "аля" http://del.icio.us/. Конечно же популярность тегов будет видна через облако тегов. Если кто-то захочет следить за ответами к определённому вопросу - он сможет подписаться на RSS ленту вопроса. Весь этот функционал должен быть элегантным и лёгким, чтобы все действия, не требующие новых страниц, были доступны через AJAX. Конечно же нужна админка, чтобы отсеивать спам или уничтожать вопросы, которые администратор посчитает вызывающими.
Но вы ведь спросите - а разве я это уже не видел где-то? Ну если вы на самом деле видели - мы пролетели, но если вы ссылаетесь на всякие faqts, eHow, Ask Jeeves или нечто подобное без нормальных ответов, Аякса, тэгов и RSS, то до нашего сайта им далеко. Мы говорим о Web2.0 приложении.
Главная суть "Спросика", в том что это не просто сайт. Это приложение, которое каждый может загрузить, установить дома или в интранете компании, покромсать и добавить пару новых фич. Исходный код будет открытым. Ваш шеф ищет управление базой знаний? Хотите сохранять информацию о трюках при ремонте машины? Не хотите создавать FAQ на своём сайте? Хватит искать! Ведь есть "Спросика"! Ну точнее будет. Подарок на рождество ;)
С чего начать?
С чего начать приложение на symfony? Всё зависит от вас. Вы можете писать рассказы, играть в планирование, найти партнёра для парного программирования, если вы приверженец экстремального программирования, или же написать детальную спецификацию сайта вместе с набросками всех объектов, состояний, взаимодействий и т.д., если вы фанат UML
Данный учебник не о разработке в целом, поэтому мы начнём с реляционной модели данных и будем добавлять новые возможности шаг за шагом. В конце каждого рабочего дня нам нужно получить работающее приложение, а не гигантский кусок кода, который ничего в итоге не выводит. В идеальном мире нужно писать тесты для каждой новой фичи, но честно говоря у нас на это просто нет времени. В один прекрасный день мы прочно свяжемся с тестами, так что не забрасывайте чтение.
На данном проекте мы воспользуемся базами данных MySQL с установленным типом данных таблиц InnoDB, которые поддерживают связывание и транзакции. Мы бы могли использовать базы данных SQLite на первых шагах и не создавать реальную базу. Для этого потребуется лишь несколько изменения в файле databases.yml, так что оставим это для вашего личного упражнения.
Модель данных
Реляционная модель
Вообще у нас будут таблицы "вопрос"(question) и ответ(answer). Так же нам понадобится таблица пользователей (user), а ещё мы будем сохранять интерес пользователей к вопросам через таблицу interest и релевантность через таблицу relevancy.
Пользователи должны будут авторизоваться, чтобы добавлять вопросы, устанавливать релевантность ответов и определять интерес к вопросам. Пользователи не должны будут авторизоваться для добавления ответов, но ответ всегда будет привязан к пользователю, таким образом пользователя с популярными ответами будут вознаграждены. Ответы, введённый без авторизации будут показаны как ответы основного пользователя, известного как 'Трус-аноним'. Всё проще понимаемо при помощи реляционной диаграммы:

Заметьте - мы определили для каждой таблицы поле created_at. Symfony видит такие поля и устанавливаем им текущие дату и время системы при сохранении записи. Тоже самое и для полей updated_at - их значения устанавливаются в соответствии с текущим временем при обновлении записи.
schema.xml
Реляционная модель должна быть переведена в конфигурацию, понятную для symfony. Для этой цели существует файл schema.yml, расположенный в каталоге /config. Symfony поддерживает схемы как в xml так и yml форматах.
Есть 2 пути создания данного файла - написать от руки (этот путь нам нравится больше) или из существующей базы. Воспользуемся первым способом.
Для начала удалим пример YAML файла:
$ svn delete config/schema.yml
Синтаксис файла schema.xml. объясняемый детально на сайте Propel, весьма прост - это XML файл, в котором тэги
| Action name | Description |
|---|---|
| list | показывает все записи таблицы |
| index | отправляет на list |
| show | Показывает поля определённой записи |
| edit | отображает форму для создания или редактированяи записи |
| update | меняет запись в соответствии с параметрами и отправляет на show |
| delete | deletes a given record from the table |
Про генерацию можно узнать в главе про генераторацию кода
В каталоге apps/frontend/modules вы можете найти модуль для вопросов и посмотреть его внутренности.
Если вы когда либо добавили новый класс, который должен быть в автозагрузке, не забудьте почистить кэш:
$ symfony cc frontend config
Самое время протестировать по адресу http://askeet/question


Можете немного поиграться, добавить парочку вопросов, отредактировать их, поудалять. Если всё работает - значит объектная модель корректна, подключение к базе верно и связка между реляционной моделью базы данны и объектной моделью symfony тоже правильная. Вот и всё функциональное тестирование.
Ещё увидимся!
Вы не написали ещё ни единой строчки PHP-кода, а ведь у вас уже есть базовое приложение. Не так уж плохо для второго дня. В следующий раз мы начнём уже писать потихоньку код и создадим страницу приветствия, на которой отобразим список вопросов. Так же мы введём тестовые данных в нашу базу используя скрипты и научимся расширять модели.
Коментарии:
Пытался сделать как написано.
в итоге получил
Fatal error: Class 'QuestionForm' not found in /usr/lib/php/symfony/generator/sfModelGenerator.class.php on line 321
Используете позднюю версию Symfony. Вы хоть бы написали, в каком месте именно эта ошибка появилась. Вероятно вам нужно использовать propel:generate-module вместо propel:generate-crud.
ответить



