Как направить URL в PHP? - PullRequest
       48

Как направить URL в PHP?

3 голосов
/ 14 мая 2011

Я пытаюсь внедрить URL-маршруты в мою собственную инфраструктуру mvc, и мне нравится искать лучший способ сделать это. Я думаю, три решения.

  1. Создайте файл XML и прочитайте его в моем контроллере внешнего интерфейса, затем загрузите соответствующий контроллер.
  2. Создайте таблицу, в которой хранятся маршруты, затем выполните запрос в моем контроллере внешнего интерфейса, а затем загрузите соответствующий контроллер.
  3. используйте xml или таблицу, затем загрузите маршруты в memcache и используйте его.

Меня беспокоит # 1 и # 2, что я должен читать таблицу или xml для каждого доступа. Я обеспокоен тем, что №3 не все хостинговые компании поддерживают memcache.

Любые предложения будут оценены!

Добавлено: думаю, я запутал некоторых людей. Под «маршрутом» я на самом деле говорю о переписывании… как… я хочу переписать посетителей в «/ controller / action», когда они посещают «/ привет»

Спасибо

Ответы [ 3 ]

2 голосов
/ 14 мая 2011

Я бы не использовал XML или таблицы для этого.Это потребует дополнительных ресурсов для такой (в сравнении) легкой операции.У вас должен быть скрипт, который загружается mod_rewrite, он разбирает URL, загружает соответствующий контроллер и выполняет действие.

0 голосов
/ 31 октября 2011

Я думаю, что могу переформулировать и даже обобщить проблему:

  • Вы хотите создать представление для чего-либо (в данном случае URL-маршрутов), которое легко читается человеком (например, XML);
  • Вам также может понравиться, что это представление может быть легко сгенерировано компьютером (например, из таблицы базы данных);
  • Во время выполнения вы не хотите, чтобы решение было медленным:например, анализ большого XML-файла, чтение с диска или выборка строк из базы данных.
  • Вы не знаете, какое решение для кэширования будет доступно в производственной среде.

Поэтому вы должны стремиться к:

  • Выполнению медленных операций (чтение из базы данных, анализ XML) как можно меньше - возможно, на этапе компиляции или сборки или «при первом запуске».
  • Быстрое выполнение сопоставления маршрутов: скомпилируйте правила непосредственно в код PHP и выполняйте их как регулярные выражения или что-то подобное.
  • Кэшируйте код правила как файл php и включайте его как обычныйкод.APC - это кэш php-кода, который обычно доступен во всех производственных средах.

Это привело бы меня к реализации решения со следующими классами и методами:

Router :: addRoute (pattern, controller) - добавляет маршрут Router :: match (uri) - возвращает соответствующий контроллер

Вы можете хранить маршруты в любом удобном для вас формате (XML, Json, в базе данных) и генерировать простое включение PHPфайл для быстрой загрузки маршрутов во время выполнения:

<?php
// compiled_routes.php
$router = new Router();
$router->addRoute('/', 'HomeController');
$router->addRoute('/widgets', 'WidgetsController');

tl; dr: отделить синтаксический анализ правил маршрута от соответствия маршрута.Выполните синтаксический анализ правил только один раз и скомпилируйте результат в код PHP, который может быть кэширован APC.

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

0 голосов
/ 31 октября 2011

Эй, я знаю, что это немного поздно, но, пожалуйста, проверьте мой Класс маршрутов . Я знаю, что сейчас вам это может не понадобиться, но, надеюсь, оно все еще будет полезно для других.

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

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

...