phoenix-framework - 在 Plug Module 中使用 Controller 和 Conn 功能的最佳方法是什么?
问题描述
我想在我的凤凰应用程序中编写自己的插件。该插件用于检查 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
,Programming Phoenix 1.4 Book 使用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)
推荐阅读
- python - 无法修补函数内的对象
- javascript - 如何切换班级
- wiremock - 与 Wiremock-standalone 中的 XML 声明匹配的请求正文
- c# - 在 .NET core c# 控制台应用程序中调用 Node Http Triggered azure 函数
- php - 如何将图像标题转换为 slug 并将其保存到数据库中?拉拉维尔
- java - 如何为 Strimzi-Kafka 桥启用 JMX 指标
- python - 如何使用 layer.Timedistributed 处理 Keras 中的两个输入?
- java - 当用户在我的录音机应用程序中录制时,我想在屏幕上显示音频频谱,我该怎么做?
- python - 如何使用系统安装包?
- javascript - 用于 css 和 javascript 的 Bootstrap cdn 链接是否适用于 CRM?