Письма в symfony - куда мне поместить код ?! - PullRequest
2 голосов
/ 29 июля 2011

Я задал вопрос о том, что action.class.php становится очень большим.Было много полезных ответов.Вы можете прочитать здесь: Несколько action.class.php

Из-за того, что action.class.php становится большим, может быть проблема в том, что в нем много всего.Хорошо, у меня есть модель, поэтому, например, я могу поместить запросы в lib / model / doctrine / ... и переместить пару форм.

Каков наилучший способ переместить действие, касающееся писем в symfony!Где я должен положить код?Есть ли лучший способ отправить электронную почту в Symfony?

Спасибо!

Craphunter

Мой пример:

if ($this->form->isValid()) {
            $formData = $this->form->getValues();
            $firstname = $this->userdata->getFirstname();
            $lastname = $this->userdate->getLastname();

            try {
                $message = Swift_Message::newInstance()
                        ->setFrom('man@example.com')
                        ->setTo($this->shopdata->getEmail())
                        ->addReplyTo($this->userdata->getEmail())
                        ->setSubject($formData['subject'])
                        ->setBody($this->getPartial('emailcontact', $arguments = array(
                                    'firstname' => $firstname,
                                    'lastname' => $lastname,
                                    'message' => $formData['message'],
                                )));
                $this->getMailer()->send($message);
                $this->getUser()->setFlash('shop_name', $formData['email']);
                $this->getUser()->setFlash('name', $formData['name']);

            } catch (Exception $e) {

                $this->getUser()->setFlash('mailError', 'Technical Problem');
            }
            $this->redirect('aboutus/sendfeedbackthankyou');

1 Ответ

2 голосов
/ 29 июля 2011

Я считаю полезным поместить код отправки в основной класс, который расширяет sfActions. Я обычно добавляю туда все, что обычно используется в проекте (код, помогающий использовать ajax и т. Д.).

Особенно для электронной почты, у меня есть статический метод

public static function mail($options, $mailer) {

    sfProjectConfiguration::getActive()->loadHelpers('Partial');

    $required = array('subject', 'parameters', 'to_email', 'to_name', 'html', 'text');
    foreach ($required as $option)
    {
      if (!isset($options[$option])) {
        throw new sfException("Required option $option not supplied to ef3Actions::mail");
      }
    }

    $address = array();
    if (isset($options['from_name']) && isset($options['from_email'])) {
      $address['fullname'] = $options['from_name'];
      $address['email'] = $options['from_email'];
    } else
      $address = self::getFromAddress();


    if(!isset($options['body_is_partial']) || $options['body_is_partial']==true ){

      $message = Swift_Message::newInstance()
          ->setFrom(array($address['email'] => $address['fullname']))
          ->setTo(array($options['to_email'] => $options['to_name']))
          ->setSubject($options['subject'])
          ->setBody(get_partial($options['html'], $options['parameters']), 'text/html')
          ->addPart(get_partial($options['text'], $options['parameters']), 'text/plain');

    } else {

      $message = Swift_Message::newInstance()
          ->setFrom(array($address['email'] => $address['fullname']))
          ->setTo(array($options['to_email'] => $options['to_name']))
          ->setSubject($options['subject'])
          ->setBody($options['html'], 'text/html')
          ->addPart($options['text'], 'text/plain');

    }

    if (isset($options['cc']) && !is_null($options['cc'])) {
      if (is_array($options['cc'])) {
        foreach ($options['cc'] as $key => $value) {
          if (!is_number($key))
            $message->addCc($key, $value);
          else
            $message->addCc($value);
        }
      } elseif (is_string($options['cc'])) {
        $message->addCc($options['cc']);
      }
    }

    if (isset($options['bcc']) && !is_null($options['bcc'])) {
      if (is_array($options['bcc'])) {
        foreach ($options['bcc'] as $key => $value) {
          if (!is_number($key))
            $message->addBcc($key, $value);
          else
            $message->addBcc($value);
        }
      } elseif (is_string($options['bcc'])) {
        $message->addBcc($options['bcc']);
      }
    }

    if (isset($options['attachments'])) {
      $atts = $options['attachments'];
      if (is_array($atts)) {
        foreach ($atts as $att) {
          $message->attach(Swift_Attachment::fromPath($att));
        }
      } elseif (is_string($atts)) {
        $message->attach(Swift_Attachment::fromPath($atts));
      }
    }

    try
    {
      return $mailer->send($message);
    } catch (Exception $e)
    {
      throw new Exception("Erro ao tentar enviar um email: " . $e->getMessage());
    }

  }

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

  // SEND EMAIL FROM ACTION
$opts = array();
$opts['from_name'] = 'Webmaster';
$opts['from_email'] = 'from@email.com';

$variables = array();
// variables passed to the partial template
$variables['%client_firstname%'] = $firstName;
$variables['%client_lastname%'] = $lastName;
$variables['%client_email%'] = $client_email;
// preenche opcoes de envio
$opts['parameters'] = array();
$opts['body_is_partial'] = false;
$opts['to_name'] = $variables['%client_firstname%'] . " " . $variables['%client_lastname%'];
$opts['to_email'] = $variables['%client_email%'];
$opts['subject'] = __($subject, $variables);
$opts['html'] = __($message_html, $variables);
$opts['text'] = __($message_text, $variables);
if (isset($cc)) $opts['cc'] = $cc;
$bcc = sfDoctrineKeyValueProjectStore::get("{$contexto}_message_bcc");
if (isset($bcc)) $opts['bcc'] = $bcc;

return dcActions::mail($opts, sfContext::getInstance()->getMailer());

Также принудительно используется отправка обеих версий электронной почты (html и текст). С таким кодом вы также можете использовать партиалы для доставки сообщений электронной почты. Я нахожу это очень полезным.

...