Где лучше формировать письмо
Где лучше формировать письмо
У меня при регистрации пользователя, на указанный при регистрации адрес электронной почты отправляется письмо с с регистрационной информацией.
Сейчас формирование письма, заполнение всех полей, происходит внутри контроллера отвечающего за регистрацию, но как мне кажется это не совсем то место где это необходимо делать...
Кто как подходил к решению это проблемы?
Сейчас формирование письма, заполнение всех полей, происходит внутри контроллера отвечающего за регистрацию, но как мне кажется это не совсем то место где это необходимо делать...
Кто как подходил к решению это проблемы?
- Svyatov
- Сообщения: 459
- Зарегистрирован: 2010.08.12, 14:50
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Где лучше формировать письмо
У меня так: в компоненте с общими методами есть метод отправки e-mail, в нужных контроллерах в нужных методах формируется письмо (шаблоны писем лежат в папках вьюх контроллера), далее в функции отправки мыла передается заголовок, адрес и тело письма (т.е. основное заполнение полей, относящихся к отправке почты реализуются в методе отправки e-mail).
Re: Где лучше формировать письмо
Передаю в шаблон все значение. В принципе так же как и Svyatov.
Код: Выделить всё
Yii::app()->mailer->Body = $this->renderPartial('../email/feedback',
array('contact'=>$contact),true);
Re: Где лучше формировать письмо
Да про шаблоны то понятно.
Я спрашивал про другое. Сейчас я имею такую структуру. В контроллере который отвечает за регистрацию пользователя есть метод который заполняет все необходимые поля для почты и отправляет почту.
И я думаю что это не самое удачное место для этого, так как создает кучу дублированного кода в будущем.
пока я обдумываю о двух вариантах:
- перенести код отправки в модель, и тогда отправка почты будет выглядеть так $model->sendMail();
- перенести код отправки почты в отдельный класс CAction.
Вот и мне стало интересно, кто как решал такое.
Я спрашивал про другое. Сейчас я имею такую структуру. В контроллере который отвечает за регистрацию пользователя есть метод который заполняет все необходимые поля для почты и отправляет почту.
И я думаю что это не самое удачное место для этого, так как создает кучу дублированного кода в будущем.
пока я обдумываю о двух вариантах:
- перенести код отправки в модель, и тогда отправка почты будет выглядеть так $model->sendMail();
- перенести код отправки почты в отдельный класс CAction.
Вот и мне стало интересно, кто как решал такое.
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: Где лучше формировать письмо
Код: Выделить всё
$model=new Register();
if($model->saved()){
$this->setMessage('На ваш e-mail адрес были высланы инструкции по активации');
$this->sendEmail($model->email, '/email/user/register', array(
'model'=>$model
));
$this->redirect(array('login'));
}
$this->render('register',array(
'model'=>$model
));
Re: Где лучше формировать письмо
Кучу дублированного кода в будущем ты имел ввиду, когда появится необходимость оправлять электронные письма и по другому поводу? Например, рассылка новостей, восстановление пароля или сообщения о каких-либо событиях. Тогда можно попробовать Консольное приложение. Сразу скажу, что так не делал, это лишь идея (причем почерпнутая именно в той самой документации).AbS_ писал(а):Да про шаблоны то понятно.
Я спрашивал про другое. Сейчас я имею такую структуру. В контроллере который отвечает за регистрацию пользователя есть метод который заполняет все необходимые поля для почты и отправляет почту.
И я думаю что это не самое удачное место для этого, так как создает кучу дублированного кода в будущем.
пока я обдумываю о двух вариантах:
- перенести код отправки в модель, и тогда отправка почты будет выглядеть так $model->sendMail();
- перенести код отправки почты в отдельный класс CAction.
Вот и мне стало интересно, кто как решал такое.
Т.е. смысл такой, создаем таблицу в БД очередей писем (типа кому, откого, тема, текст события, важность сообщения, дата постановки в очередь). Т.е. когда пользователь зарегистрировался, то просто добавляется запись в базу данных. Написать консольное приложение, которое бы выдергивала из базы порцию, например 10 записей, в порядке важности и отправляло письма, удаляет эти записи. Потом с помощью Cron'а(видел его на многих веб-серверах) настроит периодический вызов команды - Выполнение действий по cron-у. Ну и получается, что у нас будут периодически отправляться по 10 писем. И что нам будет необходимо, то просто добавлять письма в очередь, будь-то восстановление пароля или сообщение на ответ по теме
Re: Где лучше формировать письмо
Так и сделано.
Но мне не нравиться что заполнение модели Маил, происходит в контроллере, хотя это может просто лишнее опасение.
Но мне не нравиться что заполнение модели Маил, происходит в контроллере, хотя это может просто лишнее опасение.
Re: Где лучше формировать письмо
А где ее еще заполнять? Я познакомился с MVC совсем недавно и мало его еще знаю, но по-моему как раз контроллер и предназначен, чтобы работать с моделями(заполнять, удалять и изменять), и отправлять все это представлениям, чтобы показывать результат.AbS_ писал(а):Так и сделано.
Но мне не нравиться что заполнение модели Маил, происходит в контроллере, хотя это может просто лишнее опасение.
Или здесь о заполнении модели Майл в контроллере, который по идеи работает с моделью Юзер, и ему не нужно управлять другими моделями. Тут может и правда сделать какие-нибудь события, на которые реагировали бы другие компоненты, но в этом я пока не силен
Re: Где лучше формировать письмо
Я создал класс NotificationManager, который является приемником эвентов и занимается отправкой уведомлений.
В моделе:
В контроллере:
Соответственно, если нужно добавить кроме мыла еще методы для уведомления, это делается в notificationManager'е. Если есть еще места где можно утверждать юзеров и тд, достаточно подписаться на событие approved. Как мне кажется очень удобно.
Код: Выделить всё
class NotificationManager
{
/**
* Уведомление о аппруве
*@param CModelEvent $event
*/
public function approved($event)
{
// мой экстеншн для отправки нотификейшнов
Yii::app()->notification
->addRecipientsFromModel('Email', $event->sender, 'email')
->setComponentSetting('Email', 'subject', 'Ваша кандидатура утверждена')
->setView('approved')
->send();
}
}
Код: Выделить всё
public function doApprove()
{
...
$this->onApproved(new CModelEvent($this));
...
}
/**
* Событие срабатывающее при утверждении юзера
* @param CModelEvent $event
*/
public function onApproved($event)
{
$this->raiseEvent('onApproved', $event);
}
Код: Выделить всё
public function actionApprove()
{
...
$notificationManager = new NotificationManager();
$employeeModel->onApproved = array($notificationManager, 'approved');
...
}