我想通过控制器编写通用逻辑。
我想我应该使用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
请告诉我如何仅针对我使用的控制器方法进行调整。
答案 0 :(得分:2)
老实说,我不认为这是Plug
的任务。虽然您肯定可以使用Plug.Router
来区分index01
和index02
,但请执行以下操作:
defmodule MyRouter do
use Plug.Router
plug :dispatch
get "/index01" do
# common_logic
end
forward "/index02", to: MainRouter
end
根据{{3}}的说法,Plug
以来,它看起来像是一种过度杀伤:
- Web应用程序之间可组合模块的规范
- Erlang VM中不同Web服务器的连接适配器
醇>
这里你真正需要的是一个简单的旧函数,它接受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
函数。