2013-05-28 121 views
5

什麼是一些好的方法(庫或代碼)在Clojure中執行路由和URL生成?Clojure中的反向路由/ URL生成?

我看了一下Compojure的源代碼,但沒有看到它的路由意味着也用於URL生成。那裏還有什麼?

如果您用證據和/或經驗進行備份,「沒有這樣的庫」的答案實際上非常有用。

這個問題的動機來自Rails Routing Guide的第一部分:「Rails路由器可以識別URL並將它們分配給控制器的動作,它還可以生成路徑和URL,避免在視圖中硬編碼字符串。 「親愛的你:我知道有人在那裏(也許?)想說:「不要擔心網址生成;只是硬編碼你的網址的字符串」。是的,我知道我可以這樣做,但這並不構成對這個問題的答案。 :)這是而不是關於組合路由和URL生成的智慧或利弊的問題。這是關於你是怎麼做到的?

回答

4

Pedestal的服務層既做路由又做URL生成;該功能在Pedestal文檔的Service Routing部分進行了描述。

2

我剛剛遇到route-one看起來像這樣做。它是一個與Compojure完全兼容的小型庫,並提供了一種定義可以反向運行的路線的方法。

從他們的文檔,你可以定義這樣的路線:

(defroute document "/documents/:document-id") 

和幾個輔助函數,將產生:

(document-path :document-id "123") 
;; => "/documents/123" 

(with-base-url "https://myservice.com" 
    (document-url :document-id "123")) 
;; => "https://myservice.com/documents/123" 
0

很久以後,但Clojure的生態系統已經移動相當有點:

  • 墊座service-routing是否(但需要其他東西買入)
  • bidi只做你所描述的,並且與其他庫有很好的比較。

從比迪煙的README兩者,這裏是一個比較(使用Run code按鈕): (我這樣做是爲了使用HTML,因爲計算器降價沒有表支持)。

<table> 
 
<thead> 
 
<tr> 
 
<th>Library</th> 
 
<th>clj</th> 
 
<th>cljs</th> 
 
<th>Syntax</th> 
 
<th>Isomorphic?</th> 
 
<th>Self-contained?</th> 
 
<th>Extensible?</th> 
 
</tr> 
 
</thead> 
 
<tbody> 
 
<tr> 
 
<td><a href="https://github.com/weavejester/compojure">Compojure</a></td> 
 
<td>✔</td> 
 
<td></td> 
 
<td>Macros</td> 
 
<td></td> 
 
<td>✔</td> 
 
<td></td> 
 
</tr> 
 
<tr> 
 
<td><a href="https://github.com/cgrand/moustache">Moustache</a></td> 
 
<td>✔</td> 
 
<td></td> 
 
<td>Macros</td> 
 
<td></td> 
 
<td>✔</td> 
 
<td></td> 
 
</tr> 
 
<tr> 
 
<td><a href="https://github.com/clojurewerkz/route-one">RouteOne</a></td> 
 
<td>✔</td> 
 
<td></td> 
 
<td>Macros</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
<td></td> 
 
</tr> 
 
<tr> 
 
<td><a href="http://pedestal.io/">Pedestal</a></td> 
 
<td>✔</td> 
 
<td></td> 
 
<td>Data</td> 
 
<td>✔</td> 
 
<td></td> 
 
<td></td> 
 
</tr> 
 
<tr> 
 
<td><a href="https://github.com/thatismatt/gudu">gudu</a></td> 
 
<td>✔</td> 
 
<td></td> 
 
<td>Data</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
<td></td> 
 
</tr> 
 
<tr> 
 
<td><a href="https://github.com/gf3/secretary">secretary</a></td> 
 
<td></td> 
 
<td>✔</td> 
 
<td>Macros</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
</tr> 
 
<tr> 
 
<td><a href="https://github.com/DomKM/silk">silk</a></td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
<td>Data</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
</tr> 
 
<tr> 
 
<td><a href="https://github.com/Prismatic/fnhouse">fnhouse</a></td> 
 
<td>✔</td> 
 
<td></td> 
 
<td>Macros</td> 
 
<td></td> 
 
<td></td> 
 
<td>✔</td> 
 
</tr> 
 
<tr> 
 
<td>bidi</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
<td>Data</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
<td>✔</td> 
 
</tr> 
 
</tbody> 
 
</table>