I’ve been tasked with rewriting an existing website with large pre-existing link catalog. For argument’s sake, let’s assume we can’t do anything that would change the link catalog. Here’s a few examples of the link structure we’re working with:
-
An item page would be:
www.domain.com/widgets/some-totally-awesome-large-purple-widget -
A category sub page page would be:
www.domain.com/widgets/purple-widgets -
A category parent page page would be:
www.domain.com/widgets/ -
A custom page may be:
www.domain.com/some-random-page
The various page types are too numerous to write individual Routers for.
Using Router::connect I can easily account for the first and second scenarios using something like:
Router::connect('/{:pageroot}/{:pagekey}', 'Pages::index');
In turn, the Pages::index method looks for entries in our database with the “key” of ‘/widgets/purple-widgets’.
However, the framework defaults to the ‘/{:controller}/{:action}/{:args}’ route for pages like the third and fourth. I know that this is the correct behavior for the framework. Also, best practice would state that I should write the site to match this behavior. But, that isn’t an option here.
What I need is a Router that would allow the third and fourth examples to function the same as the first. All examples should be sent to the Pages::index controller, which in turn queries a database using the URL path as a key.
If you don’t have any convention in the URL for what is what, between page, item and category. I’d go with a very generic router.
And in
Pages::any()to search for the correct stuff. Is thatcategoryapageafter all (example 4)? Is thatpageanitem(example 1)?or
You store the URL somewhere (e.g. a mapping table in the database) and use the
patternversion of a lithium Route.From that point, you’ll get the full URL.