Elixir 角色插入路由器phoenix内部
目前,我有一个角色插件,如下所示:Elixir 角色插入路由器phoenix内部,elixir,phoenix-framework,phoenix,Elixir,Phoenix Framework,Phoenix,目前,我有一个角色插件,如下所示: plug Roles, :role 它接收特定角色作为第二个参数,并从正在使用的当前令牌中获取当前用户。我是这样使用控制器模块内部的插头的: plug Roles, :manage_users when action in [:index, :show, :delete] 问题是,我想将所有这些逻辑移到router.ex,以明确控制器的配置 从文档中,默认的管道/1和管道/1只接收一个作为标识符的原子,因此无法将参数传递给我的插头 使用这个插头的正确方法是
plug Roles, :role
它接收特定角色作为第二个参数,并从正在使用的当前令牌中获取当前用户。我是这样使用控制器模块内部的插头的:
plug Roles, :manage_users when action in [:index, :show, :delete]
问题是,我想将所有这些逻辑移到router.ex
,以明确控制器的配置
从文档中,默认的管道/1
和管道/1
只接收一个作为标识符的原子,因此无法将参数传递给我的插头
使用这个插头的正确方法是什么,这样我就可以在
router.ex
内部使用它?我最后使用了一些宏魔术:
defmodule PlugUtils do
defmacro __using__(_) do
quote do
import unquote(__MODULE__)
end
end
defmacro param_pipe(pipe_name, plug_name, plug_params) do
quote do
pipeline unquote(pipe_name) do
plug unquote(plug_name), unquote(plug_params)
end
pipe_through unquote(pipe_name)
end
end
end
开关依次可通过以下方式在路由器模块中使用:
use PlugUtils
param_pipe :backups_upload, RolePlug, :upload_backup
这种方法唯一的缺点是我不能指出控制器的原子,因为这个插件是在路由器插件之前执行的,但是通过创建单独的作用域,同样的事情也可以实现