Почему действия контроллера в Фениксе передаются как атомы, а не функции? - PullRequest
0 голосов
/ 21 февраля 2019
defmodule HelloWeb.Router do
  use HelloWeb, :router

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

В этом примере почему функция контроллера не передается напрямую, как get("/", PageController.index)?

1 Ответ

0 голосов
/ 21 февраля 2019

Я думаю, что для этого есть две причины.Первый заключается в том, как имя модуля становится известным.В вашем примере у вас есть область действия для HelloWeb, а затем конечная точка get в PageController.На самом деле это вызывает модуль HelloWeb.PageController.

Вторая причина, которая, на мой взгляд, здесь более важна, заключается в том, что функция фактически не вызывается напрямую.Когда вы use HelloWeb, :controller, он определяет функцию action/2 для вас в вашем модуле.Эта action/2 функция - то, что вызывается.Он просто вызывает указанную вами функцию.

Может показаться, что это излишне сложно.Но это позволяет нам определить вашу собственную функцию action/2 в вашем модуле, чтобы переопределить функцию, предоставляемую Phoenix.Возможно, все действия в данном модуле требуют записи из базы данных.Это то место, где вы можете сделать это и поместить его в назначение соединения.

...