mailService = $mailService; $this->referenceResolver = $referenceResolver; } /** * @param MigrationStep $step * @return mixed * @throws \Exception */ public function execute(MigrationStep $step) { parent::execute($step); if (!isset($step->dsl['mode'])) { throw new \Exception("Invalid step definition: missing 'mode'"); } $action = $step->dsl['mode']; if (!in_array($action, $this->supportedActions)) { throw new \Exception("Invalid step definition: value '$action' is not allowed for 'mode'"); } $this->skipStepIfNeeded($step); return $this->$action($step->dsl, $step->context); } /** * @param array $dsl * @param array $context * @return true * @throws \Exception */ protected function send($dsl, $context) { // cater to Swiftmailer 5 and 6 if (is_callable(array('Swift_Message', 'newInstance'))) { $message = Swift_Message::newInstance(); } else { $message = new Swift_Message(); } if (isset($dsl['from'])) { $message->setFrom($this->resolveReferencesRecursively($dsl['from'])); } if (isset($dsl['to'])) { $message->setTo($this->resolveReferencesRecursively($dsl['to'])); } if (isset($dsl['cc'])) { $message->setCc($this->resolveReferencesRecursively($dsl['cc'])); } if (isset($dsl['bcc'])) { $message->setBcc($this->resolveReferencesRecursively($dsl['bcc'])); } if (isset($dsl['subject'])) { $message->setSubject($this->resolveReferencesInText($dsl['subject'])); } if (isset($dsl['body'])) { $message->setBody($this->resolveReferencesInText($dsl['body'])); } if (isset($dsl['attach'])) { $path = $this->resolveReferencesRecursively($dsl['attach']); // we use the same logic as for the image/file fields in content: look up file 1st relative to the migration $attachment = dirname($context['path']) . '/' . $path; if (!is_file($attachment)) { $attachment = $path; } $message->attach(Swift_Attachment::fromPath($attachment)); } if (isset($dsl['priority'])) { $message->setPriority($this->resolveReferencesRecursively($dsl['priority'])); } if (isset($dsl['read_receipt_to'])) { $message->setReadReceiptTo($this->resolveReferencesRecursively($dsl['read_receipt_to'])); } if (isset($dsl['return_path'])) { $message->setReturnPath($this->resolveReferencesRecursively($dsl['return_path'])); } if (isset($dsl['reply_to'])) { $message->setReplyTo($this->resolveReferencesRecursively($dsl['reply_to'])); } if (isset($dsl['sender'])) { $message->setSender($this->resolveReferencesRecursively($dsl['sender'])); } $this->mailService->send($message); // q: shall we set any reference? // q: what to return? return true; } /** * @todo should be moved into the reference resolver classes */ protected function resolveReferencesRecursively($match) { if (is_array($match)) { foreach ($match as $condition => $values) { $match[$condition] = $this->resolveReferencesRecursively($values); } return $match; } else { return $this->referenceResolver->resolveReference($match); } } /** * Replaces any references inside a string * * @param string * @return string * @throws \Exception */ protected function resolveReferencesInText($text) { return $this->referenceResolver->resolveEmbeddedReferences($text); } }