查看源代码 Phoenix.VerifiedRoutes (Phoenix v1.7.14)
提供带有编译时验证的路由生成。
使用 sigil_p
宏,可以在应用程序中的所有路径和 URL 上进行编译时验证,验证内容与您的 Phoenix 路由器(s)相匹配。例如,以下路径和 URL 用法
<.link href={~p"/sessions/new"} method="post">Log in</.link>
redirect(to: url(~p"/posts/#{post}"))
将根据您的标准 Phoenix.Router
定义进行验证。
get "/posts/:post_id", PostController, :show
post "/sessions/new", SessionController, :create
不匹配的路由将发出编译器警告。
warning: no route path for AppWeb.Router matches "/postz/#{post}"
lib/app_web/controllers/post_controller.ex:100: AppWeb.PostController.show/2
此外,插值的 ~p 值通过 Phoenix.Param
协议进行编码。例如,应用程序中的 %Post{}
结构体可以派生 Phoenix.Param
协议来生成基于 slug 的路径,而不是基于 ID 的路径。这允许您在应用程序中使用 ~p"/posts/#{post}"
,而不是 ~p"/posts/#{post.slug}"
。有关更多详细信息,请参阅 Phoenix.Param
文档。
查询字符串也支持在已验证的路由中使用,无论是传统的查询字符串形式
~p"/posts?page=#{page}"
还是作为关键字列表或值映射
params = %{page: 1, direction: "asc"}
~p"/posts?#{params}"
与路径段一样,查询字符串参数是正确的 URL 编码,可以直接插值到 ~p 字符串中。
选项
要验证应用程序模块中的路由,例如控制器、模板和视图,请使用 use Phoenix.VerifiedRoutes
,它支持以下选项
:router
- 用于验证 ~p 路径的必需路由器:endpoint
- 用于 ~p script_name 和 URL 生成的可选端点:statics
- 用于将静态目录视为已验证路径的可选列表
例如
use Phoenix.VerifiedRoutes,
router: AppWeb.Router,
endpoint: AppWeb.Endpoint,
statics: ~w(images)
用法
应用程序中大多数路径和 URL 生成需求都可以通过 ~p
和 url/1
来满足,其中构建路径或 URL 所需的所有信息都由传递给 use Phoenix.VerifiedRoutes
的端点和路由器中的编译时信息提供。
也就是说,在某些情况下,需要使用 path/2
、path/3
、url/2
和 url/3
当
%Plug.Conn{}
、%Phoenix.LiveSocket{}
或%URI{}
的运行时值决定路径或 URL 的形成时,这种情况发生在以下场景中Phoenix.Controller.put_router_url/2
用于覆盖端点的 URLPhoenix.Controller.put_static_url/2
用于覆盖端点的静态 URL
当路由器模块与传递给
use Phoenix.VerifiedRoutes
的模块不同时,例如库代码或依赖多个路由器的应用程序代码。在这种情况下,可以显式地将路由器模块提供给path/3
和url/3
.
跟踪警告
所有静态路径段必须以正斜杠开头,并且在动态插值之间必须有一个静态段,以便在没有警告的情况下验证路由。例如,以下路径会生成正确的警告
~p"/media/posts/#{post}"
而这个则不允许编译器看到完整的路径
type = "posts"
~p"/media/#{type}/#{post}"
在这种情况下,最好编写一个类似 media_path/1
的函数,该函数根据不同的 ~p
分支处理每种类型。
与任何其他编译警告一样,当包含 ~p 的文件发生更改或路由器发生更改时,Elixir 编译器都会发出警告。要查看以前针对没有新更改的文件发出的警告,可以将 --all-warnings
标志传递给 mix compile
任务。以下示例将显示编译器在编译当前应用程序代码时以前遇到的所有警告
$ mix compile --all-warnings
*注意:Elixir >= 1.14.0 是全面警告所需的。旧版本可以正常编译,但不会发出任何警告。
摘要
函数
生成带有路由验证的路由器路径。
生成带有路由验证的路由器路径。
生成带有路由验证的路由器路径。
根据静态资源的文件路径生成完整性哈希。
根据静态资源的文件路径生成路径。
根据静态资源的文件路径生成 URL。
返回带有相关脚本名称前缀的路径,不进行验证。
生成带有路由验证的路由器 URL。
从连接、套接字或 URI 生成带有路由验证的路由器 URL。
从连接、套接字或 URI 和路由器生成带有路由验证的 URL。
函数
生成带有路由验证的路由器路径。
有关更多信息,请参阅 sigil_p/2
。
当提供的路径与 use Phoenix.VerifiedRoutes
或 @router
模块属性中指定的路由器不匹配时,发出警告。
示例
import Phoenix.VerifiedRoutes
redirect(to: path(conn, ~p"/users/top"))
redirect(to: path(conn, ~p"/users/#{@user}"))
~H"""
<.link href={path(@uri, "/users?page=#{@page}")}>profile</.link>
<.link href={path(@uri, "/users?#{@params}")}>profile</.link>
"""
生成带有路由验证的路由器路径。
有关更多信息,请参阅 sigil_p/2
。
当提供的路径与路由器参数中指定的路由器不匹配时,发出警告。
示例
import Phoenix.VerifiedRoutes
redirect(to: path(conn, MyAppWeb.Router, ~p"/users/top"))
redirect(to: path(conn, MyAppWeb.Router, ~p"/users/#{@user}"))
~H"""
<.link href={path(@uri, MyAppWeb.Router, "/users?page=#{@page}")}>profile</.link>
<.link href={path(@uri, MyAppWeb.Router, "/users?#{@params}")}>profile</.link>
"""
生成带有路由验证的路由器路径。
插值的命名参数通过 Phoenix.Param
协议进行编码。
当提供的路径与 use Phoenix.VerifiedRoutes
或 @router
模块属性中指定的路由器不匹配时,发出警告。
示例
use Phoenix.VerifiedRoutes, endpoint: MyAppWeb.Endpoint, router: MyAppWeb.Router
redirect(to: ~p"/users/top")
redirect(to: ~p"/users/#{@user}")
~H"""
<.link href={~p"/users?page=#{@page}"}>profile</.link>
<.link href={~p"/users?#{@params}"}>profile</.link>
"""
根据静态资源的文件路径生成完整性哈希。
有关更多信息,请参阅 Phoenix.Endpoint.static_integrity/1
。
示例
iex> static_integrity(conn, "/assets/app.js")
"813dfe33b5c7f8388bccaaa38eec8382"
iex> static_integrity(socket, "/assets/app.js")
"813dfe33b5c7f8388bccaaa38eec8382"
iex> static_integrity(AppWeb.Endpoint, "/assets/app.js")
"813dfe33b5c7f8388bccaaa38eec8382"
根据静态资源的文件路径生成路径。
有关更多信息,请参阅 Phoenix.Endpoint.static_path/1
。
示例
iex> static_path(conn, "/assets/app.js")
"/assets/app-813dfe33b5c7f8388bccaaa38eec8382.js"
iex> static_path(socket, "/assets/app.js")
"/assets/app-813dfe33b5c7f8388bccaaa38eec8382.js"
iex> static_path(AppWeb.Endpoint, "/assets/app.js")
"/assets/app-813dfe33b5c7f8388bccaaa38eec8382.js"
iex> static_path(%URI{path: "/subresource"}, "/assets/app.js")
"/subresource/assets/app-813dfe33b5c7f8388bccaaa38eec8382.js"
根据静态资源的文件路径生成 URL。
有关更多信息,请参阅 Phoenix.Endpoint.static_url/0
和 Phoenix.Endpoint.static_path/1
。
示例
iex> static_url(conn, "/assets/app.js")
"https://example.com/assets/app-813dfe33b5c7f8388bccaaa38eec8382.js"
iex> static_url(socket, "/assets/app.js")
"https://example.com/assets/app-813dfe33b5c7f8388bccaaa38eec8382.js"
iex> static_url(AppWeb.Endpoint, "/assets/app.js")
"https://example.com/assets/app-813dfe33b5c7f8388bccaaa38eec8382.js"
返回带有相关脚本名称前缀的路径,不进行验证。
示例
iex> unverified_path(conn, AppWeb.Router, "/posts")
"/posts"
iex> unverified_path(conn, AppWeb.Router, "/posts", page: 1)
"/posts?page=1"
返回端点的 URL,不进行验证。
示例
iex> unverified_url(conn, "/posts")
"https://example.com/posts"
iex> unverified_url(conn, "/posts", page: 1)
"https://example.com/posts?page=1"
生成带有路由验证的路由器 URL。
有关更多信息,请参阅 sigil_p/2
。
当提供的路径与 use Phoenix.VerifiedRoutes
或 @router
模块属性中指定的路由器不匹配时,发出警告。
示例
use Phoenix.VerifiedRoutes, endpoint: MyAppWeb.Endpoint, router: MyAppWeb.Router
redirect(to: url(conn, ~p"/users/top"))
redirect(to: url(conn, ~p"/users/#{@user}"))
~H"""
<.link href={url(@uri, "/users?#{[page: @page]}")}>profile</.link>
"""
当您希望验证与传递给 use Phoenix.VerifiedRoutes
的路由器不同的路由器时,也可以提供路由器
redirect(to: url(conn, OtherRouter, ~p"/users"))
转发路由也会自动解析。例如,假设您的主路由器中有一个指向管理员路由器的转发路径
defmodule AppWeb.Router do
...
forward "/admin", AppWeb.AdminRouter
end
defmodule AppWeb.AdminRouter do
...
get "/users", AppWeb.Admin.UserController
end
主应用程序路由器中的转发路径将像往常一样进行验证,例如 ~p"/admin/users"
。
从连接、套接字或 URI 生成带有路由验证的路由器 URL。
有关更多信息,请参阅 url/1
。
从连接、套接字或 URI 和路由器生成带有路由验证的 URL。
有关更多信息,请参阅 url/1
。