Работа с псевдонимами URL в CakePHP

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

  1. Пользователь заходит на наш сайт, используя один из рекламных псевдонимов URL-адресов, который был предварительно создан для конкретной рекламы в СМИ (журнала, веб-рекламы и т. д.).
  2. URL-адрес сверяется с базой данных псевдонимов URL-адресов, и, если псевдоним существует, в сеанс записывается специальный код отслеживания.

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

  1. Putting the lookup script in the beforeFilter() in appcontroller, so that its included in every controller. (Writes a session value so it only perfoms once.)
    • This option only works for existing contollers, and gives the Cake 'missing controller' error if a URL doesn't exist.
  2. Конкретные маршруты для каждого псевдонима в Routes.php — работает, но потенциально сотни URL-адресов псевдонимов регулярно добавляются/удаляются через интерфейс администратора.
  3. Направить все URL-адреса сайта на их собственные действия и иметь правило «все остальное» для псевдонимов URL-адресов, которые сопоставляются с моим сценарием поиска. - Месси и я теряем встроенную в Cake маршрутизацию.
  4. Пользовательский 404. - Я не хочу возвращать 404 для этих URL-адресов, так как считаю это плохой практикой, если только они действительно не сопоставляются ни с чем.

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

РЕДАКТИРОВАТЬ: Кроме того, я знаю, что подпапка под названием «promo» легко сделает это, но у меня есть много устаревших URL-адресов с нашего старого сайта, которые тоже нуждаются в обработке.


person Chris J Allen    schedule 02.06.2009    source источник


Ответы (2)


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

person Travis Leleu    schedule 02.06.2009
comment
Вам не нужно указывать маршруты каждого контроллера, вам просто нужно указать каждый контроллер, например '/my_controller/:action/' - person gnud; 03.06.2009
comment
gnud, не могли бы вы опубликовать пример маршрута, пожалуйста? Я не уверен в этом синтаксисе. Спасибо. - person Chris J Allen; 03.06.2009
comment
Попробуйте Router::connect('/mycontroller/:action/*', array('controller' =›'mycontroller')); Имейте в виду, что теперь вам нужно указать действие для запуска маршрута, просто перейти к /mycontroller/ не получится (IIRC) - person gnud; 03.06.2009
comment
большое спасибо! должен ли я сделать то же самое для контроллера страниц? - person Chris J Allen; 03.06.2009

Примечание. Я делаю предположение, что ваши рекламные URL-адреса имеют форму «domain.com/advert-259» или что-то в этом роде (т. е. не «domain.com/adverts/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() в зависимости от скорости вашего приложения и ваших требований.

person dr Hannibal Lecter    schedule 03.06.2009
comment
спасибо за это, доктор Лектер. Думаю, мне есть что почитать на маршрутах. При этом постарайтесь никого не убивать. - person Chris J Allen; 03.06.2009