Мой опыт использования фреймворка на примере создания простого сайта

10 Май
2012

Прочитав на блоге в неделю «я ненавижу php» множество негативных отзывов о языке, я понял, что практически не встречаю подобных проблем в своей работе. А я каждый день, что называется «пишу код» по 8 — 12 часов.

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

Итак, как я уже сказал, я пишу код. В качестве IDE использую NetBeans в качестве фреймворка Symfony. К сожалению до второй версии симфонии я еще не добрался. Но и в первой версии хватает плюшек. Я уверен что многие из них освещались на блоге ранее, но я все же расскажу о некотрых из них. Самый главный совет при работе с любым фреймворком, да и наверное вообще при написании кода: «Не изобретай велосипед».

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

Потом будут допилены коментарии, профили и прочее.

С чего стоит начать такой с первого взгляда не сложный проект? Я начал с создания модуля вывода историй.
Не нужно ничего выдумывать. Действуем практически по мануалу. Пишем схему базы, ничего особенного но я все же приведу ее:

history:
actAs: {Timestampable: ~}
columns:
id: {type: integer, autoincrement: true, notnull: true, primary: true}
email: {type: string(255), notnull: true}
name: {type: string(255), notnull: true}
history: {type: text, notnull: true}
public: {type: boolean, notnull: true}


Почта, имя, история ну и статус (опубликована или нет). Затем позволяем симфонии сделать всю грязную работу. Она создаст за нас базовые классы, формы, и фильтры, а так же стандартный модуль который сможет добавлять, отображать, выводить список и удалять материалы.

Следующее что нужно сделать, это просто отредактировать наш модуль. Идем в файл actions.class.php

public function executeNew(sfWebRequest $request)
{
$this->form = new historyForm();
$this->form->useFields(array('name','email','history'));
}


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

 public function executeIndex(sfWebRequest $request)
{
$this->history = new history();
$this->pager = new sfDoctrinePager(
'history',
'5'
);
$this->pager->setQuery($this->history->getActiveHistoryQuery());
$this->pager->setPage($request->getParameter('page', 1));
$this->pager->init();
$this->historys=$this->pager->getResults();
}


Вот так будет выглядеть код для создания списка из 5 постов на страницу. Как видно, жесткий уход в ООП, как писал автор постов о ущербности php, действительно очень помогает. Я не буду приводить код шаблонов там все достаточно просто. Моя цель показать как использование встроенных инструментов упрощает работу.

Далее нас интересует отправка почты админу сайта при появлении новой истории на сайте.

Для этого нам нужно настроить factories.yml на работу с выбранным нами почтовым сервером:

 response:
class: sfWebResponse
param:
send_http_headers: false

mailer:
param:
delivery_strategy: realtime

dev:
mailer:
param:
delivery_strategy: realtime

all:
mailer:
class: sfMailer
param:
logging: %SF_LOGGING_ENABLED%
charset: %SF_CHARSET%
delivery_strategy: realtime
transport:
class: Swift_SmtpTransport
param:
host: smtp.yandex.ru
port: 465
encryption: tls
username: логин
password: пароль


Далее пишем небольшой метод для отправки почты:
static public function sendmail ($emails, $theme, $body)
{
$mailer= sfContext::getInstance()->getMailer();
$myemail=''; //прописать вручную (это адрес с которого уходит почта)
if (!is_array($emails))
{
$message=$mailer->compose(array($myemail => $myemail), $emails, $theme, $body);
$message->setContentType('text/html');
$mailer->send($message);
}
else
{
foreach ($emails as $email)
{
$message=$mailer->compose(array($myemail => $myemail), $email, $theme, $body);
$message->setContentType('text/html');
$mailer->send($message);
}

}
return;
}


Этот метод будет получать на вход тему и тело письма а также либо адрес получателя, либо массив адресов и рассылать письма. Рассылкой занимается Mailer симфонии и в настройках можно установить либо моментальную отправку, либо установку в очередь и отправку по расписанию.

Далее сгенерируем админку. Благо средства симфонии сделают всю работу за нас. После генерации модуля history для админки. Установим плагин sfDoctrineGuard и закроем админку от не зарегистрированных пользователей.
Хочу отметить что предыдущий абзац это огромный пласт работы проделанный за нас фреймворком.

Итог

Мы получили веб приложение которое позволяет добавлять истории.
После добавления истории администратору приходит письмо.
Модерация осуществляется через админку.

Вот так за пару часов мы получили вменяемое простое web приложение.
PS. Встроенная система кэширования даст нам замечательный борнус к производительности.

В следующей статье я планирую рассмотреть добавление социальных кнопок на сайт и модуль коментариев.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх