在插入模块中使用Controller和Conn功能的最佳方法是什么?

问题描述 投票:1回答:2

我想在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_statushaltPlug.Conn中。 put_viewrenderPhoenix.Controller中。我知道我可以使用完整的名称空间来调用这些函数,但是看起来很多余。因此,我也在考虑import/use/alias函数。

对于Plug.Conn,《编程Phoenix 1.4手册》使用import​ Plug.Conn,某些官方插件使用alias Plug.Conn

对于Phoenix.Controller,我还没有找到任何示例,但是import可以工作。不建议在Plug中使用Controller功能吗?

我正在考虑简化代码,提高可读性和提高性能。有谁知道最佳做法是什么?

欢呼声

phoenix-framework plug
2个回答
0
投票

您可以在插头中导入Phoenix.ControllerPlug.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)

0
投票

关于别名/导入,它们都不引起性能损失。

import文档中,它说:

[只要我们想轻松地从其他模块访问函数或宏而无需使用完全限定的名称,就使用import。

并且别名也是如此,包括名称空间。

因此,alias Plug.Connimport Plug.Conn都可以在插入模块中很好地使用。

© www.soinside.com 2019 - 2024. All rights reserved.