2011-05-05 4 views
6

Je voudrais implémenter quelque chose comme des routes "dynamiques" dans mon application Mojolicious. J'ai des routes "statiques" prédéfinies et une table DB avec des alias d'URL: '/ alias' -> '/ URL'. Maintenant, je suis en train de définir des routes à la volée et cela ressemble à ceci:Routes "dynamiques" dans Mojolicious

before_dispatch => sub { 
    my ($self, $controller) = @_; 
    my $path = $controller->tx->req->url->path->to_string; 
    if (my $alias = $controller->app->model->alias->find({ alias => $path })) { 
    my $match = Mojolicious::Routes::Match->new(get => $alias->{uri}); 
    my $routes = $controller->app->routes; 
    $match->match($routes); 
    $routes->route($path)->to($match->captures); 
    } 

Mais y a-t-il un meilleur moyen?

Répondre

4

Vous ajoutez des routes au moment de l'exécution, ce qui semble être une bonne approche (bien que vous devriez probablement vérifier si une route existe avant de la redéfinir). Vous pouvez également le faire comme un catchall avec un espace réservé générique, puis transférer la demande un peu plus tard.

http://mojolicio.us/perldoc/Mojolicious/Guides/Routing#Wildcard_Placeholders

$r->get('/(*everything)')->to('mycontroller#aliases'); 
+0

Vous n'avez pas besoin de vérifier si une route existe si vous mettez le catchall au bas de votre liste de routes. Les routes sont essayées séquentiellement et la première correspondance est utilisée. –

Questions connexes