Как сделать MVC форматирование URL-адреса? - PullRequest
3 голосов
/ 07 января 2011

Я использую PHP. Я хочу создать настройку MVC с нуля, чтобы узнать больше о том, как работает MVC. Я хочу использовать чистые URL с косой чертой в качестве разделителей для аргументов. Как люди делают это, когда дело доходит до форм метода GET? Или люди избегают форм метода GET все вместе?

На данный момент я могу представить себе следующие способы:

  1. Не используйте формы метода GET (хотя в некоторых случаях это затрудняет предоставление пользователям закладки / ссылки).
  2. Используйте AJAX вместо отправки формы (хотя, что вы делаете для отключателей SEO и JS?).
  3. Пусть страница будет отправлена ​​сама себе с помощью метода post, затем преобразует переменные post в URL, а затем перенаправляет на этот URL с помощью заголовков (кажется, что вы теряете ресурсы).

Любые предложения или предлагаемые чтения приветствуются.

Ответы [ 10 ]

6 голосов
/ 07 января 2011

Вы можете использовать .htaccess файл, подобный этому

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

Итак ... если URL равен

http://example.com/controller/action/param1/

, вы можете указать путь к контроллеруи действие index.php получает переменную url [строка]
, и вы можете разделить их для загрузки контроллера ... как

$params = explode('/', $_GET['url']);
$controller = new $params[0];//load the controller
$controller->$params[1]($params[2]);//ejecute the method, and pass the param
3 голосов
/ 07 января 2011

Насколько я понимаю и мой личный опыт, ни один из ваших 3 пунктов не относится к тому, как обращаться с паттерном MVC:

  1. это хорошая и классная тема http://www.w3.org/2001/tag/doc/whenToUseGet.html, в принципе, get - это путь, если полученный URL-адрес соответствует содержанию, например, не используйте GET для передачи информации Вы хотите сохранить, не используйте POST, передайте идентификатор контента, который вы хотите показать пользователю. Все дело в шаблонах Url и переписывает, вы, вероятно, можете черпать вдохновение из маршрутизатора Zend Framework http://framework.zend.com/manual/en/zend.controller.router.html в основном не /?id=123 то же самое, что /weird-article-slug-123, когда вы знаете, что шаблон URL ^[\w\d-]+([\d]+)$?

  2. Нет, извините, AJAX - самый лучший способ использования JS, поэтому ваши функции AJAX могут использовать только преимущества вашего MVC Backend Application, так же, как и ваш "нормальный" HTML Взаимодействие делает.

  3. Это были бы действительно "потраченные впустую ресурсы"

3 голосов
/ 07 января 2011

Получить переменные и чистые URL не противоречат друг другу.Вы всегда можете иметь URL-адреса, такие как

http://example.com/controller/action?value1=foo&value2=bar

Альтернативный стиль URL-адреса также может выглядеть как

http://example.com/controller/action/value1/foo/value2/barили http://example.com/controller/action/foo/bar

В этих двух случаях, если вы хотите создать эти URL-адреса с помощью формы GET submit, вам придется использовать JavaScript для сборки правильного URL-адреса, поэтому первое решение может быть проще реализовать,

Другой вопрос - это решение между отправкой POST и GET формы.POST более безопасен, но, как вы сказали, пользователи не могут добавить его в закладки.

2 голосов
/ 07 января 2011

То, на что вы ссылаетесь с помощью URL, на самом деле имеет мало общего с MVC. Это реализация архитектуры REST. ( Статья в вики )

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

Есть несколько способов сделать это:

Вы можете использовать mod_rewrite в Apache, чтобы перезаписать PATH в соответствующие параметры GET. Например, скажем, у вас есть модуль управления пользователями, к которому обычно обращаются:

http://your.domain/users.php?request=edit&id=<some id>

Вы можете поместить в Apache:

RewriteRule ^users\/edit\/(\d+) /users.php?request=edit&id=$1

Что позволит вам затем ответить на тот же запрос:

http://your.domain/users/edit/<some id>

(предполагается, что ID - это число)

Это довольно легко сделать, если все запросы, которые вы ожидаете выполнить, довольно просты. Если они более динамичны, то все сложнее настроить. Другой недостаток, если вы хотите выпустить новую платформу, заключается в том, что она требует от вашего пользователя как минимум возможности изменять конфигурацию Apache с помощью файлов .htaccess. Это не всегда так.

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

http://your.domain/users.php/edit/<some_id>

<?php

// get the part that appears after the script name
$parts = explode("/", $_SERVER['PATH_INFO'] );

$request = $parts[1];
$id = $parts[2];

// do somethign with the $request and the $id 

?>

Как вы можете видеть, мой пример упрощен, но с вариантом 2 проще использовать гораздо более сложную логику, чтобы делать разные вещи.

Надеюсь, это поможет.

2 голосов
/ 07 января 2011

Cfreak лучший способ ответить на этот вопрос, если бы вы заглянули в различные исходные коды PHP-фреймворков, чтобы увидеть, как они реализовали подход MVC. Платформы PHP, которые я использовал, обычно исключают данные GET и полагаются на данные POST. Однако информацию можно передать через строку запроса, см. Пример ниже.

Обычно URL-адреса в средах PHP MVC выглядят примерно так: example.com/index.php/controller/action/arguments. Часть index.php обычно удаляется с помощью файла .htaccess. Ваш контроллер - это класс, который, скорее всего, наследуется от какого-то родительского класса контроллера. У вашего контроллера есть действия / методы, которые вы предпочитаете, которые вызываются далее. Вы можете передать аргументы этих методов, как правило, неограниченное количество аргументов, прикрепив их к своему URL. Я надеюсь, что это поможет дать вам общее представление о структуре. Все начинается в index.php, который будет включать все ваши необходимые файлы конфигурации, а также загружать и необходимые классы, которые вам могут понадобиться:)

1 голос
/ 07 января 2011

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

Если вы хотите углубиться в подробности, изучите MOD_REWRITE, чтобы решить ваши проблемы с URL.GET можно использовать - вы просто перепишите компоненты URL.

0 голосов
/ 08 января 2011

Эй, дхендрикс, Я делаю то, что вы делаете - изучаете MVC, изучая другие фреймворки и создавая их с нуля.

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

Относительно ваших очков:

1) Не использовать формы метода GET

Правильно. Во-первых, это звучит неправильно, что для того, чтобы получить определенное представление, вы должны использовать форму.

2) Использовать AJAX вместо отправки формы

Точно. Ваши формы и URL должны работать как с JS, так и без него.

3) Попросите страницу представить себя методом post, , затем преобразовать переменные post в URL, а затем перенаправить на этот URL с помощью заголовков (похоже, на потраченные ресурсы).

Я бы не сказал, что это потраченные впустую ресурсы. Это займет всего миллисекунды для вашего приложения. На самом деле это именно то, что я делаю в конечном итоге. Когда фронт-контроллер обнаруживает использование POST, он отправляет его контроллеру, который выполняет необходимые действия с представленными данными. В зависимости от результата приложение либо перенаправляет клиента, либо отображает запрошенную страницу (без перенаправления). И да, это работает одинаково для ЛЮБОГО URL.

В то же время, если в URL был найден определенный параметр, Front controller отправляет соответствующий контроллер. Но это никогда не используется для обработки данных в любом случае. Например, это используется для запоминания предпочтительного домена (www или мобильный), когда вы хотите использовать www при просмотре в мобильном браузере.

Также, IMO, вы могли бы сказать, что потраченные впустую ресурсы были бы APP, решающими, куда перенаправить (или передавая URL перенаправления в запросе HTTP или сеансе PHP). В любом случае для реализации альтернативных методов требуются как время разработки, так и ресурсы сервера.

Так что, на мой взгляд, # 3 - это путь.

0 голосов
/ 07 января 2011

Вопрос, который вы в основном задаете, заключается в том, как получить URL, оптимизированные для SEO (оптимизированные для поисковых систем), в формате "www.site.com/controller/action/params". Это достигается путем редактирования файла .htaccess в нескольких ключевых папках, чтобы перенаправить сервер в указанные папки, чтобы получить общую точку доступа для вашего веб-приложения, используя MOD_REWRITE. Я бы взглянул на этот учебник . Первые несколько параграфов объясняют, как получить URL, которые вы ищете.

0 голосов
/ 07 января 2011

Забудьте о втором подходе - это ужасная идея.

  1. Обычно вы можете использовать стандартную QueryString (...?a=b&c=d) в «GET формах», так как их URL не важны.
  2. Однако, если вы действительно хотите иметь красивые URL-адреса все время, вам придется отправить форму (GET / POST - не имеет значения) и перенаправить пользователя:

    if (/* form has been submitted */) {
        $data = array_map("urlencode", $_GET);
        $url = sprintf('/%s/%s/%s', $data['a'], $data['b'], $data['c']);
    
        header("Location: $url");
        echo "Redirection: <a href='$url'>$url</a>";
        exit;
    }
    
  3. В конце концов, если вы беспокоитесь о ресурсах сервера, вы можете использовать JavaScript для этого:

    formReference.addEventListener("submit", function() {
        /* do exactly the same as above PHP code */
    
        return false;
    }, false);
    

    Конечно, перенаправление на стороне сервера следует оставить на случай, если кто-то отключил JS.

0 голосов
/ 07 января 2011

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

Если бы я собирался показать список результатов для поискового запроса, я вполне мог бы пойти на неформатированный запрос GET. В конце концов, это может быть полезным URL, который люди могут обойти:

http://www.example.com/search?name=lonesomeday&site=stackoverflow

С другой стороны, если бы было только одно поле, я вполне мог бы перенаправить на более простую форму:

http://www.example.com/search/lonesomeday

YMMV, конечно.

...