首页 > 解决方案 > 在 Plug Module 中使用 Controller 和 Conn 功能的最佳方法是什么?

问题描述

我想在我的凤凰应用程序中编写自己的插件。该插件用于检查 cookie 并在 cookie 不存在时呈现错误页面。类似于 404 错误。根据逻辑,可以调用以下函数:

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 功能吗?

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

干杯

标签: phoenix-frameworkplug

解决方案


您可以导入您的插件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)

推荐阅读