2009-06-02 1 views
1

Я переписывания нашей компании веб-сайт в CakePHP, и нужно найти способ сделать следующее:Работа с Alias, URL-адреса в CakePHP

  1. пользователь вводит наш сайт, используя один из рекламных псевдонимами URLS что было pregenerated для конкретного медиа объявлений (журнала, веб продвижения и т.д.)
  2. URL-адрес проверяется против базы данных псевдонимов URL, и если псевдонима существует, то конкретный код отслеживания записывается в сеанс.

Я рассмотрел несколько вариантов, ни один из которых не подходит для этой цели. К ним относятся:

  1. Ввод сценария подстановки в beforeFilter() в AppController, так , что его включенную в каждом контроллера. (Записывает значение сеанса так это только один раз подойдет как.)
    • Эта опция работает только для существующих contollers, и выдает ошибку Cake «отсутствует контроллер» если URL не существует.
  2. Конкретные маршруты для каждого псевдонима в routes.php - работает, но есть потенциально сотни псевдонимов URLs добавлять/удалять регулярно через интерфейс администратора.
  3. Направляйте все URL-адреса сайтов на свои собственные действия и имея правило «все else», для URL-адресов псевдонимов, которые сопоставляется с моим скриптом поиска. - Messy и я теряю встроенный пирог маршрутизации.
  4. Custom 404. - Я не хочу вернуть 404 для этих адресов, так как я чувствую свою плохую практику, если они не действительно не соответствуют ни на чем.

Я действительно мог бы сделать с местом в потоке приложения, где я могу поместить этот скрипт поиска/отслеживания, и я довольно новичок в тортике, поэтому я в тупике.

EDIT: Кроме того, я знаю, что подпапка, называемая «promo», легко сделает это, но у меня много старых URL-адресов с нашего старого сайта, которые тоже нуждаются в обработке.

ответ

1

Очень интересный вопрос. Я думаю, что я бы использовал пункт №3. На самом деле это не , что messy - в конце концов, это обычно обрабатывается контроллером страниц в моих материалах. Именно так я бы справился с этим - жестко запрограммируйте маршруты к вашим контроллерам в routes.php, а затем настройте маршрут, который будет работать для ваших промо-кодов. Это позволяет вам сохранить устаревшие URL-адреса, а также использовать много стандартного материала для торта (вам, вероятно, просто придется явно указывать каждый из ваших маршрутов контроллеров, а не такую ​​работу ...) Кроме того, это позволит вам сделать некоторые классный материал с ошибками 404 - вы можете добавить туда какую-то логику, чтобы попытаться выяснить, куда они пытались идти, чтобы вы могли сверхдержавы 404.

+0

Вам не нужно указывать маршруты каждого контроллера, вам просто нужно указать каждый контроллер - например '/ my_controller /: action /' – gnud

+0

gnud, можете ли вы отправить пример маршрута, пожалуйста? Я не уверен в синтаксисе. Благодарю. –

+0

Попробуйте Router :: connect ('/ mycontroller /: action/*', array ('controller' => 'mycontroller')); Имейте в виду, что теперь вам нужно указать действие для маршрута, которое нужно выполнить, просто перейдите в/mycontroller/не будет работать (IIRC) – gnud

4

Примечание: Я исхожу из предположения, что ваши рекламные URL-адреса имеют форму «domain.com/advert-259» или что-то в этом роде (т. Е. Нет ».com/рекламы/advert-259 '). Это было бы слишком просто :)

Надеюсь, вы можете использовать маршрутизацию с некоторым регулярным выражением. Добавьте это в /config/routes.php и дайте мне знать, если другое регулярное выражение поможет :)

$controllers = Configure::listObjects('controller'); 

foreach ($controllers as &$value) 
{ 
    $value = Inflector::underscore($value); 
} 

Router::connect('/:promo', array('controller' => 'promos', 'action' => 'process'), array('promo' => '(?!('.implode('|', $controllers).')\W+)[a-zA-Z\-_]+/?$')); 

Теперь вы можете обрабатывать всю вашу промо-коду в PromosController::process().

В основном, это проверяет код промокода в url, без учета тех, кто находится в массиве $ controllers (т. Е. Ваши обычные маршруты не будут перепутаны).

Позже вы можете рассмотреть вопрос о кешировании значения Configure::listObjects() в зависимости от скорости вашего приложения и ваших требований.

+0

спасибо за это Доктор Лектер. У меня есть кое-что, что нужно делать на маршрутах, которые я думаю. В то же время старайтесь никого не убивать. –

+0

Я только убиваю невежливого :-) –

Смежные вопросы