繁体   English   中英

Controller 和 Plug in Elixir Phoenix 有什么区别?

[英]What is the different between a Controller and Plug in Elixir Phoenix?

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

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

  • Plug 使组合成为可能。 这与普通的 function 组成有何不同
  • 插头和 Controller 有什么区别? 什么时候使用什么,因为我也可以提前从 Plug 退出?
  • 最后, controller 有Actions 这些操作再次具有与基于 function 的 Plug相同的签名。 那么一个动作和一个插件有什么不同呢?

一个插头接受一个连接并将其返回修改。 所以是的,controller 也是一个插头; 动作也是插件。 我和你有同样的比喻,我把 function 插件和模块插件作为其他框架的中间件。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM