При приёме на работу дали задание:
Разработчику была поставлена следующая задача: нужно уметь отправлять пользователям сообщения на электронную почту, при этом возможно некоторые сообщения могут отправляться в формате html.
Разработчик взял задание в работу и через какое-то время предоставил код, который по его мнению способен решить поставленную задачу:
<?php
abstract class Message
{
public $to;
public $from;
public $subject;
public $template;
public $message;
abstract public function send();
public function getMessage()
{
return strtr($this->template, array('%message%' => $this->message));
}
}
class HtmlMessage extends Message
{
public $template = '<font size="12">%message%</font>';
public function send()
{
mail($this->to, $this->subject, $this->getMessage(), "From: {$this->from}");
}
}
?>
Ваша задача:
1. описать все недостатки данной архитектуры;
2. предложить новую архитектуру, которая позволит решить поставленную задачу.
Я написал вот такой класс:
<?PHP
class Message {
const TYPE_TEXT = 'text/plain';
const TYPE_HTML = 'text/html';
const TEMPLATE_REPLACEMENT = '%message%';
private $from;
private $to;
private $subject;
private $template;
private $messageText;
private $type = self::TYPE_TEXT; // По-умолчанию отправка в текстовом формате
/* Конструктор, принимающий e-mail адрес */
public function setTo($to) {
$this->to = $to;
}
/* Изменение обратного e-mail адреса */
public function setFrom($from) {
$this->from = $from;
}
/* Изменение темы письма */
public function setSubject($subject) {
$this->subject = $subject;
}
/* Изменение шаблона */
public function setTemplate($template) {
$this->template = $template;
}
/* Изменение текста письма */
public function setMessageText($text) {
$this->messageText = $text;
}
/* Изменение типа содержимого письма */
public function setMessageType($type) {
$this->type = $type;
}
/* Замена текста в шаблоне */
public function getMessageFromTemplate() {
return str_ireplace(self::TEMPLATE_REPLACEMENT, $this->messageText, $this->template);
}
/* Метод отправки письма */
public function send() {
if (empty($this->to)) throw new Exception('The field "TO" is undefined');
if (empty($this->from)) throw new Exception('The field "FROM" is undefined');
if (empty($this->template)) throw new Exception('Template is undefined');
if (empty($this->messageText)) throw new Exception('Message text is undefined');
$from = $this->from;
$to = $this->to;
$headers = "From: ".$this->from."\r\nReply-To: ".$this->from."\r\nContent-type: ".$this->type."; charset=utf-8\r\n"; // Устанавливаем необходимые заголовки письма
$subject = "=?utf-8?B?".base64_encode($this->subject)."?="; // Кодируем тему (во избежание проблем с кодировкой)
return mail($to, $subject, $this->getMessageFromTemplate(), $headers); // Отправляем письмо
}
}
/* Применение для отправки HTML*/
$mail = new Message();
$mail->setMessageType(Message::TYPE_HTML);
$mail->setTo('email@mail.ru');
$mail->setFrom('strij@yandex.ru');
$mail->setSubject('Test');
$mail->setTemplate('<font size="12">%message%</font>');
$mail->setMessageText('Привет!');
if ($mail->send()) echo 'Письмо отправлено!';
else echo 'Ошибка';
Сказали, что выполнено неудовлетворительно :(
Можете подсказать, что не так?