«Правильное» разделение / разность между index.php и фронт-контроллером

Что касается приложения PHP MVC, какова разница в работе файла index.php и переднего контроллера? Является ли фронт-контроллер в index.php , или он находится в отдельном файле? Как отделить их и позволить им работать вместе? Предполагается ли, что фронт-контроллер является классом (или как его собственный объект)? (Если это так, то index.php будет создавать экземпляр переднего контроллера?)

Я знаю, что они должны «настроить среду», которая включает определение некоторых констант и т. Д., Но что делает? (- автозагрузчик, отладочный материал и т. д.)

Я видел это: MVC с путаницей переднего контроллера , но это не решает проблему разницы между index.php и фронт-контроллером.

Фактически, index.php не должен содержать никакого значимого кода вообще, поскольку он будет только частью вашего сайта, который находится внутри DOCUMENT_ROOT веб-сервера. Это содержание должно выглядеть примерно так:

 <?php require '../application/bootstrap.php'; 

Он должен включать только файл за пределами DOCUMENT_ROOT . И это все.

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

Точка Front Controller обрабатывает все пользовательские входные данные, превращает их в расходуемую форму и, на ее основе, отправляет команду (обычно в форме вызова метода на объект). В таких языках, как Java, где все должно содержаться в классе, фронт-контроллер будет классом. Но в php у вас нет этого ограничения.

Вместо этого фронт-контроллер окажется частью вашей начальной стадии приложения:

 // --- snip --- // the autoloader has been initialized already a bit earlier $router = new Router; $router->loadConfig($configuration); $request = new Request; $request->setUri($GET['url']); // could also be $_SERVER['PATH_INFO'] or other // depends on how url rewrite is set up $router->route($request); // the request instance is populated with data from first matching route $class = $request->getParameter('resource'); $command = $request->getMethod() . $request->getParameter('action'); if (class_exists($class)) { $instance = new $class; $instance->{$command}($request); // you dispatch to the proper class's method } // --- snip --- // then there will be some other code, unrelated to front controller 

Кроме того, вы должны иметь в виду, что концепция фронтального контроллера не предназначена для приложений, которые пытаются реализовать MVC или MVC-вдохновленную архитектуру.

Index.php должен инициализировать приложение и вызывать то, что расшифровывает маршрут в контроллер и действие, и запускает их. Посмотрите на Yii, Symfony, CodeIgniter, CakePHP, посмотрите, что они делают. Все немного отличается, но тот же принцип.

Пример из index.php от Yii, чтобы сделать точку:

 <?php $yii=dirname(__FILE__).'/../../framework/yii.php'; $config=dirname(__FILE__).'/protected/config/main.php'; require_once($yii); Yii::createWebApplication($config)->run(); 

$ config передается в веб-приложение, которое служит в качестве переднего контроллера.

Вы действительно должны прочитать структуру MVC, особенно при использовании с PHP. Инициализируйте экземпляр front-controller в index.php, и он должен отобразить вашу страницу, если этот процесс является частью процедуры инициализации переднего контроллера ( __constructor() ).