长生不老药/凤凰“魔法”之路

问题描述 投票:0回答:2

我最近开始使用 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 核心以某种神秘的方式建立了这个引用。是否有任何其他“魔法”路径指向网络根目录中的其他位置?如果是这样,它们是什么,它们指向哪里?

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

phoenix-framework elixir
2个回答
1
投票

对于

static_path()
你自己正确回答了你的问题。

对于您所说的 magic 路径,它们来自您的

lib/yourapp_web/router.ex
文件,并且可能与命令行中的
mix phx.routes
任务一起列出。我相信它们被称为“路由路径”。

您可能会检查它是如何在Phoenix code中构建的。


1
投票

static_path 和 Plug.Static

static_path/1
是在
Phoenix.Endpoint
行为中定义的回调函数。查看您的
YOUAPP.Endpoint
模块内部,模块顶部有
"use Phoenix.Endpoint, otp_app: :your_app_web
。当您查看 static_path/1source 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。

你应该看看你的YourAppYourApp.ApplicationYourApp.EndpointYourApp.Router模块。 Phoenix 通常会明确定义配置。

© www.soinside.com 2019 - 2024. All rights reserved.