我已经开始自学凤凰框架 http://www.phoenixframework.org/他们的文档非常好。然而,在指定可选路由参数时,我遇到了障碍。这Phoenix 框架路由文档 http://www.phoenixframework.org/docs/routing没有提到这一点,所以我假设开发人员有责任提出解决方案。
我将列出我的用例:
- 用户访问网站
/page/test
, 一个习俗Plug http://www.phoenixframework.org/docs/understanding-plug然后实现一些代码来查找或分配locale
到连接。
- 既然没有
:locale
路径中的参数,默认值按照我的行使用pipeline,即plug HelloPhoenix.Plugs.Locale, "en"
.
- 用户访问网站
/fr/page/test
,并且相同的代码在管道中执行,除了时间:locale
参数存在于路线中,自定义插件(HelloPhoenix.Plugs.Locale
).
现在从路由的角度来看,如果我不能指定:locale
参数是可选的,我最终得到双倍的路线数量,例如:
scope "/", HelloPhoenix do
use_pipeline :browser
plug HelloPhoenix.Plugs.Locale, "en"
# Route without locale
get "/page/:slug", PageController, :show
# Route with locale
get "/:locale/page/:slug", PageController, :show
end
正如您所知,如果无法指定可选的路由参数,这可能很快就会变得非常艰巨且重复。
No I 有解决方法吗,我将在答案中发布,但我不确定它是否(a)正确,以及(b)最简单的解决方案,因为我是 Erlang、Elixir 和 Phoenix 的新手(我来自一个背景在 Ruby 和 PHP OOP 中)。
你可以有一个简单的插头,例如:
defmodule MyApp.SetLocale do
@locales ~w{en fr}
def init(opts), do: opts
def call(conn, _opts) do
case conn.path_info do
[locale | rest] when locale in @locales ->
%{conn | path_info: rest}
|> Plug.Conn.assign(:locale, locale)
_ -> Plug.Conn.assign(conn, :locale, "en")
end
end
end
然后将此插头放在端点.ex 中的路由器之前
plug MyApp.SetLocale
plug MyApp.Router
end
这样,您就可以确信在到达路由器之前就已经设置了区域设置。您根本不需要在路由器中提及它。
如果您输入的区域设置不在该区域中,此技术将返回 404@locales
though.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)