2013-05-28 7 views
5

Was sind einige gute Möglichkeiten (Bibliotheken oder Code), um Routing und URL-Generierung in Clojure durchzuführen?Reverse Routing/URL-Generierung in Clojure?

Ich schaute auf den Compojure-Quellcode, sah aber keinen Hinweis darauf, dass sein Routing auch zur URL-Generierung dienen soll. Was gibt es sonst noch?

Eine Antwort, die sagt "es gibt keine solche Bibliothek" ist tatsächlich sehr nützlich, wenn Sie es mit Beweisen und/oder Erfahrung unterstützen. Die Motivation für diese Frage kommt aus dem ersten Abschnitt der Rails Routing Guide: "Der Rails-Router erkennt URLs und sendet sie an die Aktion eines Controllers. Er kann auch Pfade und URLs generieren und die Notwendigkeit, Zeichenfolgen in Ihren Ansichten zu codieren. "

Lieber Sie: Ich kenne jemanden da draußen (vielleicht Sie?) Will sagen: "Mach dir keine Sorgen über URL-Generierung; nur Hardcode-Zeichenfolgen für Ihre URLs". Ja, ich weiß ich könnte das tun, aber das ist keine Antwort auf diese Frage. :) Dies ist nicht eine Frage über die Weisheit oder Vor- und Nachteile der kombinierten Routing-und URL-Generierung. Es ist ungefähr wie machst du es?

Antwort

4

Pedestal 's Service-Layer führt sowohl Routing-und URL-Generierung; Diese Funktionalität wird im Abschnitt Service Routing der Pedestaldokumentation beschrieben.

1

Ich habe einen minimalen Ersatz für die Routing-Makros von Compojure geschrieben, mit dem Sie Routing-Muster benennen und URLs für sie generieren können. Es ist bei https://github.com/joodie/clout-link

2

Ich bin gerade auf route-one, die aussieht, als ob es gerade dies tut. Es ist eine kleine Bibliothek, die vollständig mit Compojure kompatibel ist und eine Möglichkeit bietet, Routen zu definieren, die umgekehrt ausgeführt werden können.

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

Und ein paar Hilfsfunktionen generiert werden

: später, hat

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

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

viel, aber das Ökosystem Clojure ziemlich bewegt

Aus ihrer Dokumentation können Sie eine Route wie folgt definieren ein bisschen:

  • Sockel service-routing tut das (erfordert aber Buy-In für andere Dinge)
  • bidi tut nur, was Sie beschreiben, und hat auch einen schönen Vergleich mit anderen Bibliotheken.

aus der bidi README Genommen, hier ist ein Vergleich (verwenden Sie die Run code Taste): (ich das getan hätte HTML zu verwenden, da Stackoverflow Abschlag keine Tabelle Unterstützung hat).

<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>