#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 / уровень представления
Контроллер - код, который что-то делает.