Логирование с помощью шаблона проектирования Observer

По поводу логирования. Я там реализовал паттерн Observer, но в ручном режиме, так как ларавелевская реализация, насколько я понимаю, работает только с контроллерами.

В папке Commands/CommandsObserver/Intarfaces я сделал 2 интерфейса, один для наблюдателей, другой для сущности, которая будет наблюдаться.
Наблюдатель должен реализовывать метод update(), который и будет выполнять действие, когда будет получать уведомление от наблюдаемой сущности.

А наблюдаемая сущность должна уметь подписать на себя наблюдателя, попросить больше не наблюдать и уведомлять наблюдателя о событиях.

Наблюдатель реализуется в классе CommandObserver и является абстрактным. По сути, он занимается проверкой, что к ниму пришло уведомление именно от команды, а реализацию update() он делегирует классу Logger, который и выполняет логирование.

Наблюдаемой сущностью, я сделал класс CoreCommand, что бы не реализовывать методы attach(), detach() и notify() в каждой команде. А что бы команды наследовались от CoreCommand и тогда сразу содержали в себе реализацию этих методов

Так же, что бы передавать классу Logger информацию, которую нужно залогировать, помимо названия команды, в классе CoreCommand реализованы методы setLogInformation() и getLogInformation().

В итоге, что бы реализовать логирование, нам достаточно отнаследовать команду от CoreCommand и в методы setLogInformation() передать информацию, что нам нужно залогировать. и в handle() в конце написать parent::notify(), что бы уведомить наблюдателя, что произошло действие.