No olvides que en las ciencias informáticas cualquier problema suele tener diversas resoluciones, de igual modo nosotros te mostramos lo más óptimo y eficiente.
Solución:
Laravel 5
Esta solución funciona bien en Laravel 5:
Route::get('/admin', function ()
// url /admin
);
Route::get('/any', function ($any)
// any other url, subfolders also
)->where('any', '.*');
Lúmenes 5
Esto es para Lumen en su lugar:
$app->get('/admin', function () use ($app)
//
);
$app->get('/any:.*', function ($any) use ($app)
//
);
Alcanzar un estado 404 me parece un poco mal. Esto puede causarle todo tipo de problemas al registrar los 404. Recientemente me encontré con el mismo problema de enrutamiento con comodines en Laravel 4 y lo resolví con el siguiente fragmento:
Route::any('slug', function($slug)
//do whatever you want with the slug
)->where('slug', '([A-zd-/_.]+)?');
Esto debería resolver su problema de una manera controlada. La expresión regular se puede simplificar a:
'(.*)?'
Pero debe usar esto bajo su propio riesgo.
Editar (adición):
Como esto sobrescribe muchas rutas, debería considerar envolverlo en una declaración “App::before”:
App::before(function($request)
//put your routes here
);
De esta manera, no sobrescribirá las rutas personalizadas que defina más adelante.
Editar: ha habido cierta confusión desde el lanzamiento de Laravel 4 con respecto a este tema, esta respuesta estaba dirigida a Laravel 3.
Hay algunas maneras de abordar esto.
El primer método es emparejar (:any)/(:all?)
:
Route::any('(:any)/(:all?)', function($first, $rest='')
$page = $rest ? "$first/$rest" : $first;
dd($page);
);
No es la mejor solución porque se divide en varios parámetros y, por alguna razón (: todos) no funciona por sí solo (¿error?)
La segunda solución es usar una expresión regular, esta es una mejor manera que la anterior en mi opinión.
Route::any( '(.*)', function( $page )
dd($page);
);
Hay un método más, que le permitiría verificar si hay páginas cms incluso cuando la ruta puede haber coincidido con otros patrones, siempre que esas rutas devuelvan un 404. Este método modifica el detector de eventos definido en routes.php
:
Event::listen('404', function()
$page = URI::current();
// custom logic, else
return Response::error('404');
);
Sin embargo, mi método preferido es el #2. Espero que esto ayude. Hagas lo que hagas, asegúrate de definir todas tus otras rutas por encima de estas capturas de todas las rutas, cualquier ruta definida después nunca se activará.