functional-programming - 为什么 Phoenix 中的控制器动作作为原子而不是函数传递?
问题描述
defmodule HelloWeb.Router do
use HelloWeb, :router
scope "/", HelloWeb do
get("/", PageController, :index)
end
end
在这个例子中,为什么不直接传递控制器的函数,比如get("/", PageController.index)
?
解决方案
我认为这有两个原因。首先是模块名称是如何为人所知的。在您的示例中,您有一个范围HelloWeb
,然后是一个 get 端点PageController
。这实际上调用了HelloWeb.PageController
模块。
第二个原因,我认为这里更重要,是因为该函数实际上并没有被直接调用。当 you 时use HelloWeb, :controller
,它会在你的模块中为你定义一个action/2
函数。这个action/2
函数就是被调用的。它只是调用您指定的函数。
这似乎是不必要的复杂。但是它允许我们action/2
在你的模块中定义你自己的函数来覆盖由 phoenix 提供的函数。也许给定模块中的所有操作都需要从数据库中提取一些记录。这是您可以执行此操作并将其放在连接的分配中的地方。
推荐阅读
- c# - 协程 api 调用仅在线程睡眠后完成
- sql-server - 如果一个数字在两个单元格定义的区间内,那么让 SSIS 计算的最佳方法是什么?
- function - 如何使用 PowerShell 将 Active Directory 用户分类到互斥组?
- sql - 如何在同一个表中的角色之间交换值
- c - 检测宏参数是否为类型名
- templates - 如何在 OpenRefine 导出模板中包含属性?
- javascript - javascript 对象被覆盖
- android - Android Studio 无法导入适配器
- c# - 从一个对话框中同时获取多个选中的文件和文件夹
- python - Django 查询集过滤器,用于过去和未来的所有内容