【问题标题】:What is the different between a Controller and Plug in Elixir Phoenix?控制器和插件 Elixir Phoenix 有什么区别?
【发布时间】:2021-03-16 16:45:34
【问题描述】:

来自Node.js/Express的背景,我看到plug基本上相当于Phoenix框架中的中间件。在阅读了Controllers 之后,我注意到Controller 也是一个Plug,它本身可以包含一个或多个插头。

我对 Plug 和 Controller 的使用完全感到困惑。

  • Plug 支持组合。这与正常的函数组合有什么不同
  • 插头和控制器有什么区别?什么时候用什么,因为我也可以提前退出 Plug?
  • 最后,控制器有Actions。这些操作再次具有与基于函数的插件相同的签名。那么操作与插件有何不同?

【问题讨论】:

  • Controller 是“Plug on steroids”的 Phoenix' 名称。

标签: elixir phoenix-framework


【解决方案1】:

一个插件接受一个连接并返回它修改。所以是的,控制器也是一个插头;动作也是插件。我和你打个比方,我把函数插件和模块插件作为其他框架的中间件。

如果“每次”将请求发送到您的服务器时,您应该使用插件,您需要预处理以验证某些条件/事物或设置一些变量并在调用控制器之前采取行动。例如身份验证、i18n...我可以说大多数时候这些东西是在 cookie、会话、http-headers 上设置的...例如在身份验证中,如果用户没有会话或令牌,您可以halt在它到达控制器之前的连接,在它被设置(会话或令牌)的另一种情况下,您可以从数据库中获取用户并将其设置在连接assigns中,这将在请求期间可用生命周期。

应该使用控制器来处理通常与特定资源相关的一组特定操作。在理想地调用控制器之前,所有需要的东西都应该用插头加载。如果您必须显示用户配置文件,您可以为此定义一个路由,例如user/profile。从这条路线我不知道我正在尝试查看个人资料的用户,但我也知道用户必须登录才能查看他的个人资料。我会写一个插件来检查他是否有一个会话并在我的分配映射current_user 中设置。 Phoenix,将使用相应的操作调用相关控制器,假设它是show_profile(conn, _params),conn 将设置所有内容,然后我可以将所需的模板或响应发送给用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2021-06-10
    • 2012-05-07
    • 2018-06-03
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多