首页 > 解决方案 > 为什么 Phoenix 中的控制器动作作为原子而不是函数传递?

问题描述

defmodule HelloWeb.Router do
  use HelloWeb, :router

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

在这个例子中,为什么不直接传递控制器的函数,比如get("/", PageController.index)

标签: functional-programmingelixirphoenix-framework

解决方案


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

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

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


推荐阅读