Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

October CMS - How to correctly route

I've been reviewing the documentation for October CMS routing (https://octobercms.com/docs/plugin/registration#routing-initialization), but I think that I am missing something. I have a page called 'deals' that renders some basic information along with a plugin (called 'deals') component. The page normally appears at the url:

http://www.example.com/deals

However, I want to create a route so that if someone visits the url:

http://www.example.com/deals2

it will automatically route them back to

http://www.example.com/deals

I know that I should create a routes.php file in my plugin directory. However, when I try using

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

It complains that it can't find the 'deals' view. What am I doing wrong?

Additionally, how can I route it so that my homepage

http://www.example.com

would route to

http://www.example.com/deals
like image 808
user2694306 Avatar asked Feb 11 '16 21:02

user2694306


2 Answers

In OctoberCMS, and Laravel which it's based on, to redirect one route to another you can do this:

// 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');
}

The first route uses a route parameter with a regex constraint and will redirect any request that starts with /deals and ends with a number to your /deals route. That means it will route /deals1, /deals2, /deals3, etc to /deals.

The second route will redirect your homepage to /deals.

Of course, redirecting will cost an extra request. If you don't want to do that, then you could do the redirect in Apache or Nginx.

As per your comment, if you wanted to redirect /deals[any-number]/[anything] to /deals/[that-same-anything] then you would add an optional route parameter to the first route. That would look like this:

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

Of course, if that /deals/[anything] route doesn't exist, then you'll get a 404.

like image 154
BrokenBinary Avatar answered Sep 28 '22 04:09

BrokenBinary


Try Route::get('/deals2', function(){return Redirect::to('/deals')}); which will redirect the browser at the cost of an extra request.

like image 45
Joshua Wilson Avatar answered Sep 28 '22 02:09

Joshua Wilson