Работа с псевдонимами URL в CakePHP - PullRequest
1 голос
/ 02 июня 2009

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

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 03 июня 2009

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

1 голос
/ 02 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...