Escenario de enrutamiento de litio personalizado

Me encargaron reescribir un sitio web existente con un gran catálogo de enlaces preexistentes. Por el bien del argumento, supongamos que no podemos hacer nada que cambie el catálogo de enlaces. Aquí hay algunos ejemplos de la estructura de enlaces con la que estamos trabajando:

Una página de elementos sería:

www.domain.com/widgets/some-totally-awesome-large-purple-widget

Una página de subpágina de categoría sería:

www.domain.com/widgets/purple-widgets

Una página de página principal de categoría sería:

www.domain.com/widgets/

Una página personalizada puede ser:

www.domain.com/some-random-page

Los diversos tipos de páginas son demasiado numerosos para escribir enrutadores individuales.

Utilizando Router :: connect Puedo dar cuenta fácilmente del primer y segundo escenario usando algo como:

Router::connect('/{:pageroot}/{:pagekey}', 'Pages::index');

A su vez, el método Pages :: index busca entradas en nuestra base de datos con la "clave" de '/widgets/purple-widgets'

Sin embargo, el marco por defecto es la ruta '/ {: controlador} / {: acción} / {: args}' para páginas como la tercera y la cuarta. Sé que este es el comportamiento correcto para el marco. Además, la mejor práctica indicaría que debo escribir el sitio para que coincida con este comportamiento. Pero, esa no es una opción aquí.

Lo que necesito es un enrutador que permita que el tercer y cuarto ejemplos funcionen igual que el primero. Todos los ejemplos deben enviarse al controlador Pages :: index, que a su vez consulta una base de datos utilizando la ruta URL como clave.