我想在phoenix应用程序中编写自己的插件。插件用于检查cookie,如果cookie不存在,则呈现错误页面。与404错误类似。根据逻辑,以下那些功能可以称为:
put_status
:设置响应的状态码,我设置为422。put_view
:我的错误页面位于templates/error/422.html.eex
中,因此应包括ErrorView
。render
:呈现html页面。halt
:中断连接。conn
|> put_status(422)
|> put_view(ErrorView)
|> render("422.html")
|> halt()
put_status
和halt
在Plug.Conn
中。 put_view
和render
在Phoenix.Controller
中。我知道我可以使用完整的名称空间来调用这些函数,但是看起来很多余。因此,我也在考虑import/use/alias
函数。
对于Plug.Conn
,《编程Phoenix 1.4手册》使用import Plug.Conn
,某些官方插件使用alias Plug.Conn
。
对于Phoenix.Controller
,我还没有找到任何示例,但是import
可以工作。不建议在Plug中使用Controller功能吗?
我正在考虑简化代码,提高可读性和提高性能。有谁知道最佳做法是什么?
欢呼声
您可以在插头中导入Phoenix.Controller
和Plug.conn
并将其导入到控制器中。
defmodule DubberConnectWeb.CheckCookie do
import Plug.Conn
import Phoenix.Controller
def check_cookie(conn, _opts) do
if <check cookie existence condition..> do
conn
|> put_status(422)
|> put_view(DubberConnectWeb.ErrorView)
|> render("422.html")
|> halt()
else
conn
end
end
end
然后在您的控制器中,您只需执行
import DubberConnectWeb.CheckCookie
plug(:check_cookie)
关于别名/导入,它们都不引起性能损失。
在import
文档中,它说:
[只要我们想轻松地从其他模块访问函数或宏而无需使用完全限定的名称,就使用import。
并且别名也是如此,包括名称空间。
因此,alias Plug.Conn
和import Plug.Conn
都可以在插入模块中很好地使用。