Phoenix 框架中的可选路由参数

2024-02-11

我已经开始自学凤凰框架 http://www.phoenixframework.org/他们的文档非常好。然而,在指定可选路由参数时,我遇到了障碍。这Phoenix 框架路由文档 http://www.phoenixframework.org/docs/routing没有提到这一点,所以我假设开发人员有责任提出解决方案。

我将列出我的用例:

  1. 用户访问网站/page/test, 一个习俗Plug http://www.phoenixframework.org/docs/understanding-plug然后实现一些代码来查找或分配locale到连接。
  2. 既然没有:locale路径中的参数,默认值按照我的行使用pipeline,即plug HelloPhoenix.Plugs.Locale, "en".
  3. 用户访问网站/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(使用前将#替换为@)

Phoenix 框架中的可选路由参数 的相关文章

随机推荐