Возможно, вы захотите посмотреть концепцию Front Controller (и инверсию управления), которую вы, вероятно, уже используете в какой-то форме, но, возможно, не знаете ее.Front Controller анализирует URL и текущее состояние вещей и определяет, какой контроллер загружать.
В моей структуре у меня есть «маршруты», которые имеют атрибуты, один из которых «требует входа в систему».Front Controller определяет, какой «маршрут» / контроллер должен быть запущен, и проверяет предварительные условия для этого маршрута, такие как требование входа в систему.Если пользователь не вошел в систему, то вместо запрошенного «маршрута» / контроллера загружается логин «маршрут» / контроллер.Если вход в систему успешен, то управление передается соответствующему контроллеру «маршрута».
Управление каждым входом в систему не должно выполняться каждым контроллером, это должен делать только один контроллер, обычно фронтальный контроллер.Любой контроллер должен быть в состоянии загружаться по любому URL, поскольку именно фронт-контроллер определяет, какой контроллер загружать.Субконтроллеры не знают, «почему» они загружаются, только то, что они загружаются, чтобы выполнить свою 1 работу.