我最近开始使用 Elixir/Phonix (喜欢它) 我想了解“魔法”路径 (正如我所指的那样) 是如何工作的,哪些路径是为 Phoenix 自动配置的,以及它们指向的位置到.
通过“魔法”路径,我指的是这样的代码:
to: activity_path(@conn, :index)
或 to: user_path(@conn, :update)
或 static_path(@conn, "/js/bootstrap.min.js")
.
看来我可以为我创建的任何控制器模块使用“魔法”路径,即
defModule MyWeb.HoobitzController do
...
end
所以我可以使用
hoobitz_path()
调用 HoobitzController 中的函数。
这只适用于控制器吗?它是按控制器名称还是按控制器的文件名?
static_path()
显然指向 Web 根目录的 /priv
目录,我认为是 Phoenix 核心以某种神秘的方式建立了这个引用。是否有任何其他“魔法”路径指向网络根目录中的其他位置?如果是这样,它们是什么,它们指向哪里?
最后,这些“神奇”路径是否有“真实”名称?社区指的是什么术语来指代他们?
对于
static_path()
你自己正确回答了你的问题。
对于您所说的 magic 路径,它们来自您的
lib/yourapp_web/router.ex
文件,并且可能与命令行中的 mix phx.routes
任务一起列出。我相信它们被称为“路由路径”。
您可能会检查它是如何在Phoenix code中构建的。
static_path 和 Plug.Static
static_path/1
是在Phoenix.Endpoint
行为中定义的回调函数。查看您的YOUAPP.Endpoint
模块内部,模块顶部有"use Phoenix.Endpoint, otp_app: :your_app_web
。当您查看 static_path/1 的 source code 时,它实际上返回 "/"
作为脚本路径的默认值。
基本上,Phoenix 只为你生成路径,它不知道你的网络应用程序的位置 /priv 目录。
在你的 Endpoint 模块中,应该有这样一段代码:
plug Plug.Static,
at: "/", from: :tokenix_admin_web, gzip: false,
only: ~w(css fonts images js favicon.ico robots.txt)
关键字
from
是
从中读取静态资产的文件系统路径。它可以是:一个包含文件系统路径的字符串,一个 代表应用程序名称的原子(其中资产将 从
)或包含 应用程序名称和提供资产的目录(除了priv/static
)。priv/static
Plug.Static
模块是在有对"/"
路径的请求时提供私有/静态内容的模块。
Phoenix.Router.Helpers
Magic路径或生成路径来自Phoenix.Router.Helpers模块。 在 Phoenix.Router 编译之前,它会先定义辅助函数。它读取您的路由定义可以将其传递给Phoenix.Router.Helpers.define/2,它将根据控制器名称生成。
Helpers are automatically generated based on the controller name.
For example, the route:
get "/pages/:page", PageController, :show
will generate the following named helper:
MyAppWeb.Router.Helpers.page_path(conn_or_endpoint, :show, "hello")
"/pages/hello"
MyAppWeb.Router.Helpers.page_path(conn_or_endpoint, :show, "hello", some: "query")
"/pages/hello?some=query"
MyAppWeb.Router.Helpers.page_url(conn_or_endpoint, :show, "hello")
"http://example.com/pages/hello"
MyAppWeb.Router.Helpers.page_url(conn_or_endpoint, :show, "hello", some: "query")
"http://example.com/pages/hello?some=query"
它使用元编程生成helper_path代码。 所以本名是helper path。
你应该看看你的YourApp、YourApp.Application、YourApp.Endpoint和YourApp.Router模块。 Phoenix 通常会明确定义配置。