2

我想在我的凤凰应用程序中编写自己的插件。该插件用于检查 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并且haltPlug.Conn. put_view并且renderPhoenix.Controller. 我知道我可以使用完整的命名空间来调用这些函数,但它看起来是多余的。所以我也在考虑import/use/alias功能。

对于Plug.Conn,Programming Phoenix 1.4 Book 使用import​ Plug.Conn,一些官方插件使用alias Plug.Conn

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

我正在考虑代码的简化、可读性和性能。有谁知道这方面的最佳做法是什么?

干杯

4

2 回答 2

1

您可以导入您的插件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)
于 2019-10-03T02:08:13.053 回答
0

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

import文档中,它说:

每当我们想要轻松访问来自其他模块的函数或宏而不使用完全限定名称时,我们都会使用 import。

别名也这样做,包括命名空间。

因此,两者alias Plug.Conn都很import Plug.Conn好用在插件模块中。

于 2019-10-04T05:38:19.517 回答