Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В описательной части стандарта psr упоминаются следующие варианты использования:
1. одностороннее уведомление — «Я сделал что-то, если тебе интересно»
2. улучшение объекта — «Вот вещь, пожалуйста, измените её, прежде чем, я что-то с ней сделаю»
3. коллекция — «Дайте мне все ваши вещи, чтобы я мог что-то сделать с этим списком»
4. альтернативная цепочка — «Вот вещь, первый из вас кто справится с этим, сделает это, затем остановиться»
StoppableEventInterfaceпоскольку объекты всегда передаются по ссылке, пункт 1 это лишь частный случай пункта 2
interface CustomerNameInterface {
public function firstName(): string;
public function lastName(): string;
public function middleName(): ?string;
}
interface customerNameChangedListener {
public function onCustomerNameChange(
int $customerId,
CustomerNameInterface $customerName
);
}
interface customerNameBeforeChangeListener {
public function onBeforeCustomerNameChange(
int $customerId,
CustomerNameInterface $customerName
): CustomerNameInterface
}
Это верно, только когда передаваемые объекты содержат методы изменения данных. В случае простого DTO объекта, изменить, его нельзя.
И повторюсь, интерфейс CustomerNameInterface при разработке уже есть в системе, в описанном способе дополнительный объект «сахар» CustomerEvent не нужен.
interface LogChangesEvent {
public function getObjectIdentifier(): string;
public function getOldValue(): JsonSerializable;
public function getNewValue(): JsonSerializable;
}interface SmsNotifyEvent {
public function getRecipient(): string;
public function getText(): string;
}interface CustomerNameChangedEvent implements SmsNotifyEvent, LogChangesEvent {
public function getCustomerName(): CustomerNameInterface;
}По вашему коду получаются связи: Клиент зависит от смс и логирования, что по мне в корне не корректно, так как связь должна быть обратной. смс и логирования может не быть, это второстепенный функционал.
LogChangesEvent, но при этом модули зависят от общего модуля с описанием интерфейсов.
Альтернативный подход к подписке на события, или а так ли нужен EventObject