Логирование с помощью шаблона проектирования Observer
По поводу логирования. Я там реализовал паттерн Observer, но в ручном режиме, так как ларавелевская реализация, насколько я понимаю, работает только с контроллерами.
В папке Commands/CommandsObserver/Intarfaces я сделал 2 интерфейса, один для наблюдателей, другой для сущности, которая будет наблюдаться.
Наблюдатель должен реализовывать метод update(), который и будет выполнять действие, когда будет получать уведомление от наблюдаемой сущности.
А наблюдаемая сущность должна уметь подписать на себя наблюдателя, попросить больше не наблюдать и уведомлять наблюдателя о событиях.
Наблюдатель реализуется в классе CommandObserver и является абстрактным. По сути, он занимается проверкой, что к ниму пришло уведомление именно от команды, а реализацию update() он делегирует классу Logger, который и выполняет логирование.
Наблюдаемой сущностью, я сделал класс CoreCommand, что бы не реализовывать методы attach(), detach() и notify() в каждой команде. А что бы команды наследовались от CoreCommand и тогда сразу содержали в себе реализацию этих методов
Так же, что бы передавать классу Logger информацию, которую нужно залогировать, помимо названия команды, в классе CoreCommand реализованы методы setLogInformation() и getLogInformation().
В итоге, что бы реализовать логирование, нам достаточно отнаследовать команду от CoreCommand и в методы setLogInformation() передать информацию, что нам нужно залогировать. и в handle() в конце написать parent::notify(), что бы уведомить наблюдателя, что произошло действие.