MVC - Нет контроллера в URI? - PullRequest
2 голосов
/ 18 марта 2011

Давайте представим, что я пытаюсь выучить CI, и в качестве своего тестового проекта я создаю сайт для групповой покупки.

Мне бы хотелось, чтобы у каждого города была отдельная страница, например ::1003

http://www.groupon.com/las-vegas/
http://www.groupon.com/orlando/

Я также хотел бы иметь разные страницы, такие как:

http://www.groupon.com/learn
http://www.groupon.com/contact-us

Если я буду строить это в CI и следовать идеологии MVC, как это будет работать? Мне трудно понять, как выполнить желаемые URL-адреса с концепцией:

http://www.domain.com/controller/view/segment_a/segment_b/etc...

Ответы [ 3 ]

2 голосов
/ 18 марта 2011

То, что я хотел бы сделать, - это создать собственный контроллер 404, который действует как универсальный для несуществующих маршрутов.

Он будет принимать URI, возможно проверять его и перенаправлять на (например) контроллер "city".

Если контроллер города не может найти город (какая-либо строкабыл указан), тогда он должен выдать правильное значение 404. В противном случае вы можете отображать информацию для этого города.

Кроме того, после создания пользовательского контроллера 404 вы можете отправлять все ошибки 404 вэто путем указания маршрута с именем '404_override'.

1 голос
/ 18 марта 2011

Это на самом деле не имеет ничего общего с MVC, и гораздо больше связано с хорошим URL.

Вы ищете URL, которые являются (а) понятными с точки зрения пользователя и (б)которые дают подсказку вашему приложению о том, как оно должно обрабатываться.

В этом случае я бы немного изменил ваши URL, чтобы вместо:

http://www.groupon.com/las-vegas/
http://www.groupon.com/orlando/

Вы могли быесть URL-адреса, которые выглядят следующим образом:

http://www.groupon.com/destinations/las-vegas/
http://www.groupon.com/destinations/orlando/

Бит в начале - /destinations/ - может использоваться вашим кодом маршрутизации URL-адреса, чтобы решить, какой контроллер должен с ним работать.Если ваш код маршрутизации основан на URL, у вас может быть такой массив:

$routes = array(
    '/destinations/' => 'on_destination_list',
    '/destinations/(.+)' => 'on_destination',
    '/(.*)' => 'on_page');

// Basic URI routing code based off of REQUEST_URI
foreach ($pattern => $func) {
    if (preg_match("`^$pattern$`", $_SERVER['REQUEST_URI'], $placeholders)) {
        array_shift($placeholders);
        call_user_func($func, $placeholders);
    }
}

Имейте в виду, что я написал этот код маршрутизации на моей голове, и он может быть не совсем правильным.Это должно дать вам суть того, что вам нужно сделать.

Выполнение таких действий дает дополнительное преимущество: если кто-то перейдет на http://www.groupon.com/destinations/, у вас будет возможность показать список пунктов назначения.

1 голос
/ 18 марта 2011

Вот где URI Routing приходит. Но в вашем случае вам, вероятно, придется быть осторожным при определении ваших маршрутов, поскольку первая и единственная часть вашего маршрута уже является переменной частью.

...