defmodule HelloWeb.Router do
use HelloWeb, :router
scope "/", HelloWeb do
get("/", PageController, :index)
end
end
在此示例中,为什么不像get("/", PageController.index)
那样直接传递控制器的功能?
答案 0 :(得分:4)
我认为有两个原因。首先是如何知道模块名称。在您的示例中,您有一个HelloWeb
的作用域,然后是PageController
中的一个get端点。实际上,这称为HelloWeb.PageController
模块。
第二个原因(在这里我认为更重要)是因为实际上并未直接调用该函数。当您use HelloWeb, :controller
时,它将在您的模块中为您定义一个action/2
函数。这个action/2
函数就是被调用的。它只是调用您指定的函数。
这似乎不必要地复杂。但是它允许我们在模块中定义自己的action/2
函数,以覆盖phoenix提供的函数。也许给定模块内的所有动作都需要从数据库中提取一些记录。在这里您可以执行此操作,并将其放入连接的分配中。