Реализованы ли контроллеры PHP MVC перезаписью URL? - PullRequest
1 голос
/ 23 января 2010

Контроллер в Java EE приложение может быть представлено сервлет, который может быть в настоящее время реализовано с использованием JavaServer Faces (JSF).

Но в PHP такого сервлета нет, так что я думаю, он реализован с помощью перезаписи URL?

Чтобы каждый запрос был направлен на этот контроллер?

Ответы [ 5 ]

2 голосов
/ 23 января 2010

Это можно сделать с помощью mod_rewrite, но в основном в php есть механизм front-controller, который выполняет все управление одним файлом. Таким образом, все контроллеры указываются в URL. Более подробное описание контроллеров и mvc см. В php.

1 голос
/ 03 июля 2010

Как показали большинство других ответов, обычно это делает mod_rewrite. Но если вы не хотите использовать mod_rewrite, вы можете позволить вашему файлу начальной загрузки фактически настраивать переменные из самого URL.

Я использую несколько своих собственных функций, которые создают массив из URL, поэтому:

site.com/page/welcome/param1/param2

становится

$url[0] = 'page'
$url[1] = 'welcome'
$url[2] = 'param1'
$url[3] = 'param2'

и затем я могу передать массив $ url моему маршрутизатору, и он решает, к каким частям вызова Controller / Action / Param относится каждый элемент.

Тот же URL-запрос, показанный выше, создает вызов Controller / Action / Param:

// http request for site.com/page/welcome/param1/param2
$controller = new Page_Controller('param1', 'param2');
$controller->welcomeAction();

в то время как, в зависимости от настроек в моем объекте Router, я могу создавать подкаталоги, например, для вызовов 'admin /':

// http request for site.com/admin/page/welcome/param1/param2
$controller = new Admin_Page_Controller('param1', 'param2');
$controller->welcomeAction();

С помощью url_rewrite я думаю, что было бы сложнее (хотя все еще возможно) добавить эти перенаправления, и с моим методом (некоторые фреймворки могут также делать это, не слишком уверенно), это позволяет вам настраивать его больше, т.е. массив $ url, если необходимо, перед передачей его в объект Router.

Я не уверен, что минусы в использовании этого метода, но он работает очень хорошо для меня!

1 голос
/ 23 января 2010

MVC в PHP обычно использует фронт-контроллер, который служит единственной точкой входа в приложение.

Обычно это реализуется с помощью mod_rewrite, чтобы направить все запросы в php-файл, содержащий ваш код начальной загрузки.

Этот код начальной загрузки будет содержать ваш фронт-контроллер.

Фронт-контроллер берет его оттуда, перенаправляя запрос на основе входных параметров в соответствующий контроллер. Ваш целевой контроллер обычно указывается в качестве одного из параметров.

Итак, когда вы нажмете:

http://yourdomain.com/blog/new

Приложение перенаправит запрос на ваш загрузочный код с помощью вашего фронт-контроллера, который интерпретирует этот ввод так, что «блог» - это запрашиваемый контроллер, «новый» - это действие. Затем он создает экземпляр контроллера «блог», передает ему «новое» действие, а остальное - стандартный MVC.

1 голос
/ 23 января 2010

Я думаю, это называется шаблоном Front Controller http://en.wikipedia.org/wiki/Front_controller и обычно достигается с помощью правил mod_rewrite, что любые запросы на физически несуществующие файлы перенаправляются в index.php, который затем решает, что делать.

0 голосов
/ 23 января 2010

Вы бы использовали mod_rewrite, чтобы перенаправить все в файл index.php. Таким образом, вы используете mod_rewrite, если вы хотите это:

http://example.com/page/welcome

а не

http://example.com/index.php?page/welcome

или

http://example.com/index.php?controller=page&action=welcome

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...