для начала научись грамотно формулировать мысли и приводить работоспособные примеры
1. все строится на интерфейсах которые у тебя нихрена не описаны - откуда-то появляется UserControllerInterface
2. для проброса объектов использовать либо контейнеры, либо фабрики
3. не стоит пытаться создать holy controller подходящий для решения все задач
4. к OCP твой вопрос никак не относится - суть данного принципа в том, что свойства классов приватные, а геттеры/сеттеры - публичные, это позволит расширять класс при этом не модифицируя напрямую родителя