在凤凰城哪里写共同的逻辑

时间:2018-05-27 07:33:36

标签: elixir phoenix-framework

我想通过控制器编写通用逻辑。 我想我应该使用plug。但是我不知道编码。

我想在FooController和BarController中仅对index01使用通用逻辑,但是使用index02。

foo_controller.ex

defmodule MyAppWeb.FooController do
  use MyAppWeb, :controller

  def index01(conn, _params) do
    ~~~
  end

  def index02(conn, _params) do
    ~~~
  end
end

bar_controller.ex

defmodule MyAppWeb.BarController do
  use MyAppWeb, :controller

  def index01(conn, _params) do
    ~~~
  end

  def index02(conn, _params) do
    ~~~
  end
end

我在下面编写路由器。

router.ex

pipeline :browser do
  plug :accepts, ["html"]
  plug :fetch_session
  plug :fetch_flash
  plug :protect_from_forgery
  plug :put_secure_browser_headers
  plug MyAppWeb.CommonLogic, repo: MyAppWeb.Repo
end

common_logic.ex

defmodule MyAppWeb.CommonLogic do
  import Plug.Conn

  def init(opts) do
    IO.puts("init!!")
    opts
  end

  def call(conn, repo) do
    IO.puts("call!!!")
    conn
  end
end

请告诉我如何仅针对我使用的控制器方法进行调整。

2 个答案:

答案 0 :(得分:2)

老实说,我不认为这是Plug的任务。虽然您肯定可以使用Plug.Router来区分index01index02,但请执行以下操作:

defmodule MyRouter do
  use Plug.Router

  plug :dispatch

  get "/index01" do
    # common_logic
  end

  forward "/index02", to: MainRouter
end
根据{{​​3}}的说法,Plug以来,它看起来像是一种过度杀伤:

  
      
  1. Web应用程序之间可组合模块的规范
  2.   
  3. Erlang VM中不同Web服务器的连接适配器
  4.   

这里你真正需要的是一个简单的旧函数,它接受conn, params个参数并返回conn。这样你就可以简单地称它为:

defmodule MyAppWeb.FooController do
  use MyAppWeb, :controller

  def index01(conn, params) do
    SharedLogic.index01(conn, params)
  end
  ...
end

基本上就是这样。

答案 1 :(得分:2)

我希望我能正确理解你的问题,我看到了解决这个问题的两种方法:

<强> 1。在rooter中

pipeline :browser do
  #leave the default stuff there
end

pipeline :common_logic do
  plug MyAppWeb.CommonLogic
end

scope "/", MyWebApp do
  pipe_through(:browser)
  get "/foo/index02", FooController, :index02
  get "/bar/index02", BarController, :index02

  pipe_through(:common_logic)
  get "/foo/index01", FooController, :index01
  get "/bar/index01", BarController, :index01
end

<强> 2。直接在控制器中 - 首先从rooter中删除你的插件 - 在控制器中:

foo_controller.ex

defmodule MyAppWeb.FooController do
  use MyAppWeb, :controller
  plug(MyAppWeb.CommonLogic when action in [:index01])


  def index01(conn, _params) do
    ~~~
  end

  def index02(conn, _params) do
    ~~~
  end
end

和bar控制器相同

话虽如此,我不会亲自选择上述任何一项。 我会尝试在index函数或插件中进行一些模式匹配,而不是构建许多index_xx函数。