derekkraan
[abandoned] Proposal for multiple "~p" sigils
I have been using a multi-endpoint setup in my app, just because I think it makes the most sense for a multi-subdomain app. This worked well enough with the old style of route helpers, since I could call them with their fully qualified module names.
Now with the introduction of ~p, things have become more complicated. The crux of the issue is: there can only be one ~p sigil defined per module. This means that it is not possible to use verified routes for multiple routers in the same template.
The result is that I have resorted to using just string literals in the places where cross-domain links are present.
My proposal is to make the sigil that is defined customizable, with a default to p when no other has been defined.
Usage would look something like this:
use Phoenix.VerifiedRoutes,
endpoint: MyApp.Endpoint,
router: MyApp.Router,
statics: MyApp.statics,
sigil: "MYAPP"
And then you would be able to use the sigil like this: ~MYAPP"/my_path".
This would make it possible for several sigils to be defined in a single module.
I’d be happy to provide a PR if there is agreement that this would be a good addition to Phoenix.
[edit: apparently path/3 and url/3 exist and I just didn’t know about them. In light of that it seems unlikely that this proposal will be accepted]
Most Liked
LostKobrakai
You can use verified routers also with path(conn_or_socket_or_endpoint_or_uri, router, ~p"…").
derekkraan
still I am not a friend of that
Discussion on that change was pretty heated so I don’t think you’re the only one. Still, it’s there.
by convention
I think with new capabilities there will be new conventions.
Personally I’m very much in favour of the new sigil capabilities. There are a thousand new sigils that one could imagine, and the all upper caps means that you will readily be able to see where magic is happening.
christhekeele
As a thought experiment, an interesting alternative would be to provide the desired router as a suffix.
You could hack around how sigils allow lists of characters at the end, to support things like Regex modifier flags such as ~r/(^(?<line>.*?)$/m for multi-line regexes.
Sadly, ~p"my_path"MyApp.Router would not work because of how the . gets parsed; these modifiers only accept ASCII letters and digits. So we’re back to doing something like configuring an alias in your Router, but with even nastier metaprogramming to implement:
use Phoenix.VerifiedRoutes,
endpoint: MyApp.Endpoint,
router: MyApp.Router,
statics: MyApp.statics,
sigil_specifier: "myapprouter"
~p"/my_path"myapprouter
which is frankly worse.
Popular in Proposals: Ideas
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









