为什么Phoenix中的控制器动作作为原子而不是函数传递?

时间:2019-02-21 16:12:36

标签: functional-programming elixir phoenix-framework

defmodule HelloWeb.Router do
  use HelloWeb, :router

  scope "/", HelloWeb do
    get("/", PageController, :index)
  end
end

在此示例中,为什么不像get("/", PageController.index)那样直接传递控制器的功能?

1 个答案:

答案 0 :(得分:4)

我认为有两个原因。首先是如何知道模块名称。在您的示例中,您有一个HelloWeb的作用域,然后是PageController中的一个get端点。实际上,这称为HelloWeb.PageController模块。

第二个原因(在这里我认为更重要)是因为实际上并未直接调用该函数。当您use HelloWeb, :controller时,它将在您的模块中为您定义一个action/2函数。这个action/2函数就是被调用的。它只是调用您指定的函数。

这似乎不必要地复杂。但是它允许我们在模块中定义自己的action/2函数,以覆盖phoenix提供的函数。也许给定模块内的所有动作都需要从数据库中提取一些记录。在这里您可以执行此操作,并将其放入连接的分配中。