Как расширить существующую модель на PHP?

Есть класс Message с заполненными данными. Title и Text.
Надо добавить метод getUrl, которое будет вычисляемое. Но не в данный класс а в другой. Что-то в роде MessageExtend который будет расширять класс Message.

Но вопрос в том что у меня есть в наличии только Message. Мне его надо каким-то образом преобразовать в MessageExtend с заполненными свойствами моего экземпляра. У меня тут затуп небольшой: как это делается по нормальному?

В одном месте у меня реализовано так: есть конструктор в классе MessageExtend в который передается Message, там циклом проходим по свойствам объекта и заполняем. В другом месте класс "сервис". Который просто принимает экземпляр объекта и уже с ним работает.

Как-то я этот момент упустил. Буду рад помощи.
  • Вопрос задан
  • 539 просмотров
Решения вопроса 1
serginhold
@serginhold
как бы сначала надо ответить на вопрос "где это нужно и зачем"

Вариант 1
Не надо делать ооп ради ооп, просто в класс Message добавь метод getUrl()

Вариант 2
Message это какой-то сторонний класс, и нет возможности его изменить, по этому делаем над ним декоратор.

class MessageDecorator
{
    private $message;

    public function __construct(Message $message)
    {
        $this->message = $message;
    }

    public function getTitle()
    {
        return $this->message->getTitle();
    }
    
    public function getText()
    {
        return $this->message->getText();
    }

    public function getUrl()
    {
        // create url
        return 'url';
    }
}

$message = new MessageDecorator(new Message($title, $text));
$url = $message->getUrl();


Вариант 3
Выносим генерацию url в отдельный сервис

class UrlService
{
    public function getMessageUrl(Message $message)
    {
        // create url
        return 'url';
    }
}

$message = new Message($title, $text);
$urlService = new UrlService();
$url = $urlService->getMessageUrl($message);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы