Если я правильно вас понимаю, ваш класс Page
на самом деле является гибридом между автозагрузчиком, фабрикой mvc и контейнером для всего приложения. Это три разные обязанности, одна из которых совершенно бессмысленна. PHP это не Java. .. мы не используем класс "сдерживания".
Кроме того, вы должны спросить, почему ваши Model
и View
нуждаются в доступе к Route
. Хорошо, я мог бы увидеть причину этого в View, если вы также используете его для генерации новых URL, но в модели нет ничего общего с Route
.
Ответственность Контроллера заключается в том, чтобы принять запрос и на основании этого выполнить правильную команду (действие). Затем он изменяет состояние слоя Model и связывает Domain Objects
с указанного слоя с экземпляром View или другой формой ответа. Затем контроллер возвращает этот экземпляр View.
Что касается других частей, то Controller будет инициировать структуры из слоя Model, но в контроллере должны быть операторы new
. Это создало бы тесную связь с названием структур. Вместо этого вы должны оснастить экземпляр контроллера фабрикой моделей. Эта фабрика становится ответственной за инициализацию структур из слоя модели. Это также позволит вам инициализировать одно соединение с БД вне контроллера (и, возможно, некоторый объект Cache), а затем предоставить его фабрике. Теперь вы можете убедиться, что у каждого элемента слоя модели, который имеет дело с доступом к данным, уже установлено соединение с БД. И вы можете использовать одно и то же соединение между всеми объектами доступа к данным.
Что касается того, как передать маршрут к экземпляру Controller:
class Controller
{
protected $route = null;
public function setRoute( $route )
{
$this->route = $route;
}
}
потому что вы, скорее всего, будете использовать его так:
class FooBarController extends Controller{}
И где-то в bootstrap.php :
$controller = new $controllerName;
$controller->setRoute( $route );
Вы должны помнить, что конструкторы в PHP не наследуются .
P.S. Вы можете найти этот комментарий , связанный с вашим исследованием.