Comparação dos formatos de rota

5

Estou desenvolvendo um novo aplicativo e estou tentando criar uma convenção para definir rotas. Idealmente, gostaria que fosse simples, flexível e reversível.

Aqui estão algumas das estruturas populares:

Backbone

route                           matches
-----------------------------------------------------
help                            help
search/:query                   search/kiwis
search/:query/p:page            search/kiwis/p7
file/*path                      file/nested/folder/file.txt
docs/:section(/:subsection)     docs/faq, docs/faq/installing

Django

Usa regexes, mas vem com um complexo reversor de regex

route                                                           matches
-------------------------------------------------------------------------------------
^articles/2003/$                                                /articles/2003/
^articles/(\d{4})/(\d{2})/$                                     /articles/2005/03/
^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$     /articles/2003/03/03/

Ruby on Rails

:controller/:action/:id/with_user/:user_id
books/*section/:title

ASP.NET / MVC 5

{controller}/{action}/{id}           /Products/show/beverages
{resource}.axd/{*pathInfo}           /WebResource.axd?d=...
{productId:int}/{productTitle}       /5/asp-net-mvc
books/{isbn?}                        /books, /books/1430210079

O Django é provavelmente o mais flexível, e já é familiar para pessoas que conhecem regexes, mas também é o mais difícil de ler e reverter.

Backbone, RoR e ASP.NET, todos permitem partes opcionais e curinga / splat, com várias sintaxes. O MVC 5 tem algumas opções para restringir os parâmetros em linha ala :int .

Onde esses esquemas podem ficar aquém e como eles podem ser consertados?

    
por mpen 13.12.2013 / 07:29
fonte

2 respostas

2

Eu usei o ASP.NET MVC por anos. Ultimamente tenho pesquisado sobre Rails e Django para ver se eles têm algo mais a oferecer. Eu li a parte de roteamento da documentação deles, mas ainda não fiz nenhum aplicativo de verdade, então não sou especialista. Eu não tenho experiência com o Backbone, então vou deixar isso de lado.

Em resumo, o Rails possui o sistema de roteamento mais poderoso dos três, o Django tem o mais fraco e o ASP.NET MVC está em algum lugar entre eles.

Todos têm:
 - rotas nomeadas
 - wildcards (no asp.net MVC apenas o último parâmetro)
 - dados extras (passar alguns valores que não fazem parte da rota)
 - restrições de regex
 - ajudantes para criar urls
 - algum tipo de prefixo de rota (namespace / área)

Ruby on Rails e ASP.NET MVC têm:
 - roteamento genérico (uma rota, vários controladores / ações)
 - valores padrão
 - restrições de código

Ruby on Rails tem:
 - roteamento de recursos
 - poderoso redirecionamento

Exemplo de restrição regex em Ruby on Rails (id tem que ser um número)

get ':controller/:id/:action', constraints: {id: /^\d+/}

Exemplo de restrição de código no ASP.NET MVC (verifique se {year}/{month}/{day} forma uma data válida)

routes.MapRoute("date", "{year}/{month}/{day}", 
          new { controller = "Test", action = "Date" }, 
          new { year = @"\d{4}", month = @"\d{2}", day = @"\d{2}", date = new DateConstraint() }); 

// -----
public class DateConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        try
        {
            var year = int.Parse(values["year"] as string);
            var month = int.Parse(values["month"] as string);
            var day = int.Parse(values["day"] as string);
            var date = new DateTime(year, month, day);
            return true;
        }
        catch 
        {
            return false;
        }
    }
}

Exemplo de redirecionamento em Ruby on Rails

get '/stories/:name', to: redirect {|params, req| "/posts/#{params[:name].pluralize}" }
    
por 21.12.2013 / 01:10
fonte
0

Que tal manipular você rotas usando funções Angular.js e js e condicionais?   link

    
por 19.12.2013 / 20:00
fonte