Zend Mail — где создать его экземпляр?

#zend-framework #zend-mail

#zend-framework #zend-mail

Вопрос:

Я использую шаблон для сопоставления данных / шлюза.

Итак, у меня есть:

Средство отображения; Шлюз; Доменный объект (в основном с получателями и установщиками); Контроллер; Представление.

Мой вопрос таков: где я должен создать экземпляр Zend Mail? Я полагаю, что о представлении, очевидно, не может быть и речи, и шлюз также не подлежит рассмотрению.

Контроллер должен содержаться в чистоте, поэтому:

Сопоставить наш доменный объект?

Если в нашей форме будет какое-либо поле выбора, которое будет извлекать данные из базы данных, то, возможно, Mapper будет наиболее подходящим местом для создания экземпляра Zend Mail?

Спасибо

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

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

2. Да, я делаю рассылку либо в контроллере (например, @Perfection), либо в сервисе (например, @Jerry Saravia). Никогда в mapper или репозитории.

Ответ №1:

Хммм? Что ж, с помощью Zend вы можете настроить Zend_Mail в вашем bootstrap или с помощью файла application.ini или какого-либо другого конфигурационного файла. Именно так я настраиваю свой прямо сейчас. Для разработчиков я буду записывать письма в файл, а для тестирования я буду отправлять почту через реальный почтовый сервер.

Я создаю экземпляр своего экземпляра Zend_Mail в классе, который я называю Mail_Service. Этот класс почтовой службы создаст экземпляр Zend_Mail внутри, когда ему нужно отправить письмо, и будет использовать существующий экземпляр Zend_Mail, если он был создан и нужно отправить больше писем.

У него есть методы, которые будут отправлять мне предопределенные письма. Например,

 
Mail_Service->sendWelcomeEmail( $userInfo ) 
  

или

 
Mail_Service->sendActivationEmail( $userInfo )
  

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

//in the controller
//process form from browser somehow

UserAccountService->createNewUser( $userInfo );



/////////////////
/// Within the user account service

public function createNewUser( $userInfo )
{
    $userMapper->createNewUser( $userInfo );
    $preferencesMapper->createDefaultPreferencesForUser( $userInfo );

    MailService->sendWelcomeEmail( $userInfo );
}

Я не знаю, лучший ли это способ сделать это, но таким образом мой сервис будет иметь имена функций, которые имеют отношение к сервису, и захватывать весь рабочий поток вместо атомарных операций, которые просто пересылают вызовы другим объектам.

Надеюсь, это поможет.

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

1. Но вам нужно как-то составить свое электронное письмо, нет? Введите: "имя пользователя", "пароль пользователя" и также отправьте это на электронную почту. Эти данные будут получены из источника данных A. Является ли это userInfo массивом или объектом, а затем вы разделяете информацию о нем внутри, например, "sendWelcomeEmail"?

2. Эй, userInfo - это просто объект с простыми строковыми свойствами, как вы говорите. Внутри почтовой службы я использую объект Zend_View для "рендеринга" php-файла в папке "Шаблоны электронной почты". Я беру обработанную строку и использую ее в качестве текста для электронного письма. Я создаю объект Zend_View, используемый для рендеринга в почтовом сервисе, но вы также можете просто извлечь его из FrontController.

Ответ №2:

Я всегда сохраняю код, который отправляет почту, в своих контроллерах.

Модель - база данных / бизнес-логика

Просмотр - html / уровень представления

Контроллер - код, который что-то делает.