Как реализовать интерпретатор шаблонов URL, используемый Django и RoR в PHP - PullRequest
3 голосов
/ 14 октября 2008

Каков наилучший способ реализации интерпретатора / диспетчера URL, например, в Django и RoR в PHP?

Он должен иметь возможность интерпретировать строку запроса следующим образом:

  • /users/show/4 отображается на
    • область = Пользователи
    • действие = шоу
    • Id = 4
  • /contents/list/20/10 отображается на
    • площадь = Содержание
    • действие = список
    • Старт = 20
    • Количество = 10
  • /toggle/projects/10/active отображается на
    • действие = переключение
    • area = Проекты
    • id = 10
    • поле = активно

Где строка запроса может быть заданной переменной GET / POST или строкой, передаваемой интерпретатору.

Редактировать: я бы предпочел реализацию, которая не использует mod_rewrite.

Редактировать: Этот вопрос не о чистых URL, а о интерпретации URL. Drupal использует mod_rewrite для перенаправления запросов, таких как http://host/node/5 на http://host/?q=node/5.. Затем он интерпретирует значение $ _REQUEST ['q']. Я заинтересован в интерпретации.

Ответы [ 7 ]

2 голосов
/ 30 ноября 2008

То, что вы описываете в своем вопросе, должно быть частью преобразования URL. Для этого вы можете использовать пакет PEAR с именем Net_URL_Mapper . Для получения дополнительной информации о том, как использовать этот класс, взгляните на этот модульный тест .

2 голосов
/ 14 октября 2008

Почему конкретно вы предпочитаете не использовать mod_rewrite? RoR использует mod_rewrite . Я не уверен, как Django делает это, но по умолчанию mod_php сопоставляет URL-адреса с файлами, поэтому, если вы не создадите систему, которая пишет отдельный PHP-файл для каждого возможного URL (кошмар обслуживания), вам придется использовать mod_rewrite для чистых URL-адресов .

2 голосов
/ 14 октября 2008

посмотрите на реализацию cakephp в качестве примера:

https://trac.cakephp.org/browser/trunk/cake/1.2.x.x/cake/dispatcher.php

https://trac.cakephp.org/browser/trunk/cake/1.2.x.x/cake/libs/router.php

Вы также можете сделать что-нибудь с mod_rewrite:

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

Это будет перехватывать URL-адреса типа /en/foo /de/foo и передавать их в index.php с GET параметрами 'lang' amd 'url' Нечто подобное можно сделать для «проектов», «действий» и т. Д.

2 голосов
/ 14 октября 2008

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

Проверьте проекты, такие как - в произвольном порядке - Zend Framework, CakePHP, Symfony, Code Ignitor, Kohana, Solar и Akelos.

1 голос
/ 15 октября 2008

То, как я это делаю, очень просто.
Я использую файл WordPress .htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Что делает этот .htaccess, когда что-то возвращает 404, он отправляет пользователя в index.php.

В приведенном выше примере /index.php является «интерпретатором» для URL.
В index.php у меня есть что-то вроде:

$req = $_SERVER['REQUEST_URI'];
$req = explode("/",$req);

Вторая строка разбивает URL на разделы, основанные на «/». Вы можете иметь

$area = $req['0'];
$action= $req['1'];
$id = $req['2'];

Что я в итоге делаю:

function get_page($offset) {//offset is the chunk of URL we want to look at
    $req = $_SERVER['REQUEST_URI'];
    $req = explode("/",$req);
    $page = $req[$offset];
    return $page;
}
$area   = get_page(0);
$action = get_page(1);
$id     = get_page(2);  

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

0 голосов
/ 30 ноября 2008

Я делаю PHP-фреймворк, который делает именно то, что вы описываете - беру то, что делает Django, и переносит его в PHP, и вот как я сейчас решаю это:

Чтобы получить красивые и чистые URL-адреса RESTful, которые есть у Django (http://example.com/do/this/and/that/),, вам, к сожалению, необходимо переписать мод _. Но все не так мрачно, как может показаться, потому что вы можете достичь почти то же самое с URI, содержащим имя файла скрипта (http://example.com/index.php/do/this/and/that/). Мой мод _ перезаписывает, просто перенаправляет все вызовы в этот формат, так что его можно использовать почти так же, как без мода _ трюк перезаписи.

Если честно, в настоящее время я делаю последний метод с помощью GET (http://example.com/index.php?do/this/and/that/),) и исправляю вещи на случай, если будут переданы некоторые подлинные переменные GET. Но мое первоначальное исследование говорит, что использование прямой косой черты после имя файла должно быть еще проще. Вы можете найти его с определенным суперглобальным индексом $_SERVER и не требовать какой-либо настройки Apache. Не могу запомнить точный индекс, но вы можете просто сделать тестовую страницу phpinfo(), чтобы посмотрим, как вещи выглядят под капотом.

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

0 голосов
/ 14 октября 2008

Просто на секунду @ Предложение Cheekysoft , посмотрите Zend_Controller компонент Zend Framework. Это реализация шаблона Front Controller *1006*, который можно использовать независимо от остальной части фреймворка (при условии, что вы не хотите использовать полную фреймворк MVC).

И, очевидно, CakePHP наиболее похож на стиль RoR.

...