药剂/凤凰“魔术”之路

时间:2018-08-21 15:55:24

标签: elixir phoenix-framework elixir-framework

我最近开始与Elixir / Phonix (喜欢它)一起工作,我想了解'Magic'路径(正如我所指)的工作方式以及为Phoenix自动配置了哪些路径以及它们指向的位置。

通过“魔术”路径,我指的是这样的代码: to: activity_path(@conn, :index)to: user_path(@conn, :update)static_path(@conn, "/js/bootstrap.min.js")

看来我可以对我创建的任何控制器模块使用“ Magic”路径,即

defModule MyWeb.HoobitzController do
  ...
end

所以我可以使用hoobitz_path()在HoobitzController中调用一个函数。

这仅适用于控制器吗?是按控制器名称还是控制器的文件名命名?

static_path()显然指向Web根目录的/priv目录,我假设是Phoenix核心以某种神秘的方式建立了此引用。是否还有其他“魔术”路径指向网络根目录中的其他位置?如果是这样,它们是什么,它们指向何处?

最后,这些“魔术”路径是否有“真实”名称?社区指的是用什么术语来指代他们?

2 个答案:

答案 0 :(得分:0)

对于static_path(),您已经正确回答了自己的问题。

对于您所说的魔术路径,它们来自您的lib/yourapp_web/router.ex文件,并可能在命令行中与mix phx.routes任务一起列出。我相信它们被称为“路线”。

您可以检查其在Phoenix code中的构造方式。

答案 1 :(得分:0)

static_path和Plug.Static

static_path/1是在Phoenix.Endpoint行为中定义的回调函数。查看您的YOUAPP.Endpoint模块内部,在模块顶部有“ use Phoenix.Endpoint,otp_app::your_app_web`”。当您查看source code for static_path/1时,它实际上返回默认的“ /”脚本路径的值。 基本上,Phoenix只为您生成路径,并且不知道您的Web应用程序 / priv 目录的位置。

在您的Endpoint模块中,应该有一段代码如下: plug Plug.Static, at: "/", from: :tokenix_admin_web, gzip: false, only: ~w(css fonts images js favicon.ico robots.txt)

关键字from the file system path to read static assets from. It can be either: a string containing a file system path, an atom representing the application name (where assets will be served from `priv/static`), or a tuple containing the application name and the directory to serve assets from (besides `priv/static`). 当有对“ /”路径的请求时,Plug.Static模块是为私有/静态内容提供服务的模块。

Phoenix.Router.Helpers

魔术路径或生成的路径来自Phoenix.Router.Helpers模块。 在Phoenix.Router编译之前,它将define helpers function first。它读取您的路由定义,然后将其传递到将基于控制器名称生成的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" 它使用对generate helper_path code的元编程。 因此,真实姓名是助手路径。

您应该查看您的 YourApp YourApp.Application” YourApp.Endpoint YourApp.Router 模块。Phoenix通常会明确定义配置。