October CMS - Как правильно маршрутизировать

Я просматривал документацию по октябрьской маршрутизации CMS (https://octobercms.com/docs/plugin/registration#routing-initialization), но я думаю, что мне что-то не хватает. У меня есть страница под названием «сделки», которая отображает некоторую базовую информацию вместе с подключаемым модулем (называемым «сделками»). Страница обычно отображается по адресу:

http://www.example.com/deals

Однако я хочу создать маршрут, чтобы, если кто-то посетит URL-адрес:

http://www.example.com/deals2

он автоматически направит их обратно в

http://www.example.com/deals

Я знаю, что мне нужно создать файл routes.php в моем каталоге плагинов. Однако, когда я пытаюсь использовать

Route::get('/deals2', function()
{
        return View::make('deals');
});

Он жалуется, что не может найти представление «Сделки». Что я делаю неправильно?

Кроме того, как я могу направить его так, чтобы моя домашняя страница

http://www.example.com

направится к

http://www.example.com/deals

person user2694306    schedule 11.02.2016    source источник
comment
если это поможет, я использовал «грязный» обходной путь для перенаправления домашней страницы на созданном мной сайте. Добавьте это в свой файл .htaccess: RewriteRule ^/?$ http://www.example.com/deals [R=301,NC,L] вы можете сделать то же самое с другим URL-адресом, который хотите перенаправить, но, опять же, это просто обходной путь, который я использовал, потому что я не знаю, как это сделать правильно ... так что не совсем ответ.   -  person merodeador    schedule 13.02.2016
comment
Это хороший прием, но я надеюсь, что для него будет встроенный метод. Спасибо за комментарий.   -  person user2694306    schedule 15.02.2016
comment
Вы пытаетесь перенаправить /deals2 конкретно или какой-либо маршрут, например /deals[some-number]?   -  person BrokenBinary    schedule 16.02.2016


Ответы (2)


В OctoberCMS и Laravel, на которых он основан, для перенаправления одного маршрута на другой вы можете сделать следующее:

// Redirect /deals2, /deals3, ... to /deals
Route::get('{dealSlug}', function($dealSlug) {
    return redirect('deals');
})->where('dealSlug', '^deals[0-9]+');

// Redirect homepage to /deals
Route::get('/', function() {
    return redirect('deals');
}

Первый маршрут использует параметр маршрута с ограничением регулярного выражения и будет перенаправить любой запрос, который начинается с /deals и заканчивается номером, на ваш /deals маршрут. Это означает, что он направит /deals1, /deals2, /deals3 и т. Д. На /deals.

Второй маршрут перенаправит вашу домашнюю страницу на /deals.

Конечно, перенаправление будет стоить дополнительного запроса. Если вы не хотите этого делать, вы можете выполнить перенаправление в Apache или Nginx.

Согласно вашему комментарию, если вы хотите перенаправить /deals[any-number]/[anything] на /deals/[that-same-anything], вы должны добавить необязательный параметр маршрута к первому маршруту. Это выглядело бы так:

// The new first route
Route::get('{dealSlug}/{extra?}', function($dealSlug, $extra = '') {
    return redirect('deals/' . $extra);
})->where('dealSlug', '^deals[0-9]+');

Конечно, если этого /deals/[anything] маршрута не существует, вы получите 404.

person BrokenBinary    schedule 16.02.2016
comment
Это отлично сработало, спасибо. Возникает вопрос: как бы вы отрегулировали первое перенаправление, чтобы оно работало с дополнительными сегментами URL-адресов (например, / deal2 / ca-toronto переходил в / deal / ca-toronto)? - person user2694306; 17.02.2016

Попробуйте Route::get('/deals2', function(){return Redirect::to('/deals')});, который перенаправит браузер за счет дополнительного запроса.

person Joshua Wilson    schedule 16.02.2016