В настоящее время у меня есть некоторые проблемы, чтобы понять, как я должен отделить свои сущности и методы (я использую Zend Framework 3 и Doctrine).
Допустим, у нас есть следующие классы:
class Ticket{
private $optionBundle;
private $createdAt;
private $currentUserCount;
}
class OptionBundle{
private $price;
private $options;
}
abstract class Option {
abstract public function isExpired($val);
}
class RuntimeOption extends Option{
private $runtimeInDays;
public function isExpired($startDate) {
$today = new DateTime();
$expirationDate = $startDate->modify('+'.$this->runtimeInDays . ' days');
return ($today >= $expirationDate)
}
}
class LimitOption extends Option{
private $limit;
public function isExpired($currentValue) {
return $currentValue >= $this->limit;
}
}
Мой нынешний подход основан на предположении, что очень общие параметры приведут к меньшим издержкам на базу данных. Я бы просто имел несколько OptionBundles с различными комбинациями Option и мог бы применить их к каждому билету.
Чтобы определить, истек ли срок действия runtimeOption для конкретного билета, мне нужно передать дату билета в $ createAt методу isExpired () в RuntimeOption. То же самое с $ currentUserCount и LimitOption.
Где я должен определить, истек ли срок действия определенного билета, чтобы мне не нужно было слишком сильно менять его при добавлении новых опций или изменить срок действия существующей опции? В моем билете? В контроллере? Как это мне сначала нужно проверить, какой тип опции я проверяю, чтобы передать правильное значение, которое кажется проблематичным.
Также:
Я хочу иметь возможность создавать новые варианты с минимальными усилиями в будущем. В настоящее время мне нужно будет создать новый класс параметров, добавить необходимое значение в мой класс заявок и каждый существующий билет в базе данных и изменить метод, который определяет, является ли билет сроком действия. Или я должен создать еще один слой конкретных TicketOptions, который знает точное значение, необходимое для билета?
Задача ещё не решена.
Других решений пока нет …