merlin-vrn
@merlin-vrn

Почему разработчики так безаппеляционно утверждают, что один фронт-контроллер лучше?

Итак, цитата из документации. Они утверждают:
A much better solution is to use a front controller: a single PHP file that handles every request coming into your application.




Аргументируя это тем, что-де каждый файл должен выполнять одни и те же действия для инициализации: подключать библиотеки и так далее:

There are several problems with this approach, including the inflexibility of the URLs (what if you wanted to change blog.php to news.php without breaking all of your links?) and the fact that each file must manually include some set of core files so that security, database connections and the «look» of the site can remain consistent.




Через пол-страницы они предлагают использовать mod_rewrite для украшения урлов:

Using Apache's mod_rewrite (or equivalent with other web servers), the URLs can easily be cleaned up to be just /, /contact and /blog.




Итак, предлагается свернуть разные пути в один, а потом снова, уже на PHP, их различать и обрабатывать по-разному.



А ведь я мог сделать три файла /index.php, /contact/index.php и /blog/index.php и получить то же самое, зато по сравнению с подходом Symfony я:

  • свалил бы всю маршрутизацию на веб-сервер — мне вообще не придётся делать её на PHP, дополнительно она стала бы быстрее
  • не стал бы настраивать рерайтер, который неудобен в настройке, кроме того, тоже скорости не добавляет
  • смог бы легко без лишних условных конструкций пропускать для отдельных точек входа необязательные шаги, например, анализ строки параметров запроса для статических страниц
  • отдельные модули, представленные в данном случае в виде отдельных точек входа, оказались бы связаны слабее, что означает, что взаимное влияние меньше, проще адаптация, обновление и т. д.


    это то, что сообразил навскидку.



    То есть, я использую больше давно проверенного и более простого кода, а получаю в общем то же самое.



    При этом, гибкость не уменьшается. Нет никакой разницы, каким именно способом я настраиваю урлы: в магическом файлике добавляю магические строки, или же создаю директории и в них кладу магические файлики. Если мне нужно сменить урлы так, чтобы старые работали, никто не мешает мне для решения этой ненормальной задачи всё-таки задействовать рерайтер.



    По поводу «одинаковой иницизацизации» я тоже не согласен с аргументами: в этих ваших единых контроллерах всё равно приходится использовать магию типа «включение библиотек, анализ запроса, вывод ответа». Чем это отличается от строки «включить стандартную инициализацию» в отдельных точках входа?



    Я думаю, вопрос на самом деле касается не только Symfony — ведь все так делают — от Joomla до Dokuwiki. Объясните, чем это один фронт-контроллер настолько лучше, что используют его, несмотря на очевидные преимущества отдельных точек входа?
  • Вопрос задан
  • 4356 просмотров
Пригласить эксперта
Ответы на вопрос 4
Anonym
@Anonym
Программирую немного )
С одной точкой входа можно не париться по поводу маршрутизации вообще. Вы добавляете новый маршрут в конфиг и заворачиваете его на нужный контроллер. Всё. При грамотной автозагрузке, вам не надо заморачиваться по поводу того, какие классы нужны для этого конкретного контроллера. Когда количество маршрутов приближается к сотне, начинаешь понимать, что так значительно проще.
Ответ написан
nazarpc
@nazarpc
Open Source enthusiast
/blog выглядит более приятно, чем /blog/index.php и скрывает детали реализации + есть ещё динамический роутинг, когда вы заранее можете не знать, какой URL придет, и нужно сначала будет поискать в БД или ещё где-то.
Ответ написан
OnYourLips
@OnYourLips
Проще сделать роутинг на стороне приложения, чем половину на стороне приложения, а половину на стороне вебсервера.
Полностью сделать роутинг на стороне вебсервера не получится, если нужна сложная логика.

Более того, на сервере может стоять не тот вебсервер, под который вы пишете правила: к примеру вы пишете под nginx, а админы предлагают использовать Apache.
Ответ написан
UZER2006
@UZER2006
Как по мне, вопрос спорный. Ваши аргументы уместны, но я вот что думаю.
1. По поводу статики. Если статика действительно статика – то она должна отдаваться совсем отдельно. Если в ней всё-таки участвует движок – это уже не статика.
2. Ну и сама суть. Не знаю, почему, но мне как-то даже эстетически приятнее и красивее, когда в проекте одна точка входа, а не несколько в разных местах. Я согласен с тем, что инициализацию можно подключать отдельным файлом. Но это либо каждый файл начинать с подключения init-файла (как по мне, эстетически некрасиво)), либо ещё и помнить, какой файл является точкой входа, а какой нет. Ничего уже не говоря об относительной адресации внутри файловой системы.
В своё время в своём проекте использовал что-то такое. Есть одна точка входа. В url передаётся модуль, action и любые дополнительные параметры. App инициализируется, парсит request и передаёт управление нужному классу со всеми остальными параметрами. И это реально круто.
Несмотря на то, что ЧПУ уже не так актуальны, как раньше, с несколькими точками входа без маршрутизации через mod_rewrite сложно реализовать ссылки вида /news/ofigennaya-novost-s-dlinnym-zagolovkom-v-url. Да и даже если извращаться, приятнее в URL видеть предыдущую ссылку, чем /news.php/ofigennaya-novost-s-dlinnym-zagolovkom-v-url
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы