Existe um equivalente ao Route::share do Laravel 3 no Laravel 4?
Pergunta
Recentemente migrei um aplicativo do Laravel 3 para o Laravel 4 e me deparei com algo que foi usado no Laravel 3 e que não consegui encontrar equivalente no Laravel 4.
No Laravel 3 havia um Route::share
e em meu aplicativo havia a seguinte rota compartilhada que basicamente redirecionava uma série de URLs herdados para um novo URL.Obviamente, isso poderia ser feito com regras mod_rewrite, mas pode haver outro comportamento além de simples redirecionamentos que acontecem na rota que pode ser compartilhada.
Route::share( array(
array('GET', 'Songbook/songbook.html'),
array('GET', 'Songbook'),
array('GET', 'songbook/songbook.html'),
array('GET', 'songbook'),
array('GET', 'tgbs'),
), function () {
return Redirect::to( 'lyrics', 301 );
} );
Existe um equivalente a isso no Laravel 4?A única coisa que consegui fazer foi criar rotas discretas para cada um deles.Parece que deveria haver uma maneira mais elegante:
Route::get('Songbook/songbook.html', function(){ return Redirect::route('lyrics'); });
Route::get('Songbook', function(){ return Redirect::route('lyrics'); });
Route::get('songbook/songbook.html', function(){ return Redirect::route('lyrics'); });
Route::get('songbook', function(){ return Redirect::route('lyrics'); });
Route::get('tgbs', function(){ return Redirect::route('lyrics'); });
Solução
Vou postar isso como resposta à minha própria pergunta porque encontrei algo que funciona.Isso usa um parâmetro url e o where()
método com um regex para determinar se ele corresponde a algum dos URLs em uma lista.No entanto, ainda não acho que isso seja tão elegante quanto o que estava no Laravel 3 (a menos que você realmente goste de expressões regulares e as ache elegantes).
Ainda sinto que existe uma solução mais elegante.
Route::any('{any?}', function(){ return Redirect::route('lyrics'); })
->where('any', '(Songbook\/songbook\.html|Songbook|songbook\/songbook\.html|songbook|tgbs)');