My Phoenix app has a variety of scopes distinguished by host as follows:
scope "/", LockerWeb, host: "host.example.com" do
pipe_through :inertia
get "/", HostController, :index
get "/connect", HostController, :connect
end
scope "/", LockerWeb, host: "play.example.com" do
pipe_through :browser
get "/", PageController, :landing
post "/access", PageController, :access
get "/join", PageController, :show_join
post "/join", PageController, :do_join
end
Is there a better option for routes than my own homegrown replacement of VerifiedRoutes? AFAICT it doesn’t take the hostnames of scopes into consideration.
I suspect the robust solution here would be multiple endpoints, perhaps in an umbrella app, but this is already a teensy application that will perhaps max out at two dozen routes.
Thanks!
Thanks! The inbound routing part works fine with scopes in a router - it’s just that I’m not sure about the best way to build links in my app via routes. Would your approach impact how links are constructed via routes ala VerifiedRoutes ?
You can still use verified routes and changing the host in the conn.
Setting the host in the router, if you are only dealing with subdomains is great, but if the host can be more dynamic, then it might be easier to set them in the conn in your endpoint per request . If your app is running on multiple servers with their own domain then you can let your load balancer deal with it and keep your app dumb.
Phoenix.VerifiedRoutes — Phoenix v1.7.20 Phoenix.Controller — Phoenix v1.7.20
Appreciate the response. I’m probably either misunderstanding and/or I haven’t explained my issue very well.
In the example above, the verified route ~p"/"
could refer to two different controllers and two different actions. In a single response, I need to build links that could refer to either - some links in a page point to host.example.com
routes from play.example.com
and some won’t.
I’m not sure I could set the host on a per-conn basis because of this intermixing of links within a single response. Perhaps you mean setting the host on the conn when passing it into the url
methods?
Right now, my solution is a new function, cross_domain_url
that accepts a host
parameter that is derived from the same keys in config.exs
that drive the hostnames on the scopes. It works, but I’m just curious if there’s something I’m missing in how routes are supposed to work when combined with scopes with hosts.
For example, mix phx.routes
generates a number of duplicated routes because it isn’t taking the scope’s hosts into account
GET / LockerWeb.HostController :index
GET / LockerWeb.PageController :show_join
url/3 takes more then a conn, you can use conn, socket, endpoint or uri. I’ll admit I purposely did not give you an exact answer, but a more general one. The main point is, nothing stopping you from using verified routes with highly dynamic host and url generations.