LINUX.ORG.RU

В каких web-фреймфорках самый удобный и красивый роутинг?

 ,


0

2

Думаю тут, что мой формат достаточно устарел, не всегда удобен. Рассматриваю вариант упрощения и улучшения. Понятно, что лучше подсмотреть, как с этим в других вариантах.

Навскидку самый красивый и удобный роутинг — у PlayFramework:

*   /clients/{id}             Clients.show   
GET /clients/{id}/accounts/{accountId} Clients.blah.blah

Правда, немного некрасиво становится при использовании регекспов:

/clients/{<[a-z]{4,10}>id}

У Django роутинг просто ужасен:

urlpatterns = patterns('',
    (r'^articles/2003/$', 'news.views.special_case_2003'),
    (r'^articles/(?P<year>\d{4})/$', 'news.views.year_archive'),
    (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.month_archive'),
    (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$', 'news.views.article_detail'),
)

Или я что-то упустил и есть какие-нибудь более приличные ныне надстройки?

Вариант RoR не сильно лучше.

match "/:year(/:month(/:day))" => "info#about", :constraints => 
{ :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/ }

Какие ещё есть популярные варианты?

★★★★★
Ответ на: комментарий от drakmail
(defpage [:get ["/:year/:mon/:day" :year #"\d{4}" :mon #"\d{2}" :day #"\d{2}"]] {:keys [year]}
  (str "ololo msg"))
st4l1k ★★
()
Ответ на: комментарий от alienclaster

django-style, не?

Ну, этот стиль постарше Django будет :)

А где именованные группы и урлы?

Через костыли, типа
[code]
(/blogs/(\d+)/)(\d+/\d+/\d+)/ => aviaport_blogs_archive_day(3,blog_id=2)

(/(events/places)/search/?)\?(.+) => bors_auto_search_result(1,NULL,class=aviaport_admin_events_place)

'(/conferences/archives/(\d{4})/)(\d+)/ => aviaport_conferences_archive_month(NULL,year=2,month=3)',
[/code]

Я потому топик и открыл, что нахожусь в поиске более оптимального решения. Точнее, с вариантом, вроде, уже определился, надо будет как-нибудь реализовать на практике.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от drakmail

а для чего заставлять роутер заниматься проверкой входных параметров если это не его зада вообще, ала у вас апач чекал формат даты в и в обычных get параметрах?

Deleted
()
Ответ на: комментарий от Deleted

а для чего заставлять роутер заниматься проверкой входных параметров

because we can

thesame ★★★★
()
Ответ на: комментарий от Deleted

а для чего заставлять роутер заниматься проверкой входных параметров

Чтобы не размножать сущность. Иначе у нас идёт работа с параметром в роутере плюс к этому ещё нужно описать формат параметра где-то позже, в модели или контроллере. А идеальное программирование не содержит копипаста (в данном случае речь о двойных описаниях параметров).

KRoN73 ★★★★★
() автор топика

у вас пример RoR'а какой-то неудачный, как будето специально самый уродливый роутинг нашёлся)) Обычно у нас довольно внятно и красиво все выглядит.

Alve ★★★★★
()
Ответ на: комментарий от Alve

у вас пример RoR'а какой-то неудачный, как будето специально самый уродливый роутинг нашёлся))

Ну, это мне Гугль первой ссылкой выдал. Кажется, с http://rubydev.ru/2010/11/routing-ruby-on-rails-3/ :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Иначе у нас идёт работа с параметром в роутере плюс к этому ещё нужно описать формат параметра где-то позже, в модели или контроллере.

у вас формат параметров должен вычисляться из типа параметров контроллера, только так и никак иначе.

А то выходит в контроллере ожидается строка в виде даты, а в каомто левом конфигурационном файле надо это учитывать - получается трудно поддерживаемый и размазанный набор логики.

А идеальное программирование не содержит копипаста (в данном случае речь о двойных описаниях параметров).

неявное описание параметров у вас в виде определения сигнатуры метода (или модели если параметры заполняют поля модели) который вызывается в контроллере при получении запроса, а также в коде контроллера, так что именно содержит 8)

Deleted
()
18 сентября 2014 г.

Symfony же

anonymous
()

У Django раутер самый адекватный и удобный.

Сравнивал с flask, ror, sinatra, laravel, express вот этим вот всем.

C1nde
()

Revel:

# This example demonstrates all of the features:

# conf/routes
# This file defines all application routes (Higher priority routes first)

module:jobs                                          # Import all routes from the jobs module

GET    /login                 App.Login              # A simple path
GET    /hotels/               Hotels.Index           # Match /hotels and /hotels/ (optional trailing slash)
GET    /hotels/:id            Hotels.Show            # Extract a URI argument
WS     /hotels/:id/feed       Hotels.Feed            # WebSockets.
POST   /hotels/:id/:action    Hotels.:action         # Automatically route some actions.
GET    /public/*filepath      Static.Serve("public") # Map /app/public resources under /public/...
*      /debug/                module:testrunner      # Prefix all routes in the testrunner module with /debug/
*      /:controller/:action   :controller.:action    # Catch all; Automatic URL generation

anonymous
()

Ой, это какой-то некропостер тему 2012-го года поднял.

anonymous
()
Ответ на: комментарий от C1nde

С Django я, как раз, начинал. Это ужасно :D

KRoN73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.