如何将授权逻辑添加到Phoenix Channel中的基本主题,以便所有子主题获得相同的逻辑

时间:2017-12-06 16:12:59

标签: elixir phoenix-framework

我的user_socket有

defmodule MyappServerWeb.UserSocket do
  use Phoenix.Socket

  ## Channels
  channel "public:login", MyappServerWeb.LoginChannel

  channel "admin:navbar", MyappServerWeb.AdminNavbarChannel
  channel "admin:dash", MyappServerWeb.AdminDashChannel
  channel "admin:user", MyappServerWeb.UserChannel
end

这里我必须实现两个授权级别,即公共 admin 。这两个主题下的所有子主题必须继承我设置为父主题的相同授权逻辑。怎么做到这一点?或者我做错了什么? (函数式编程真的很新)

2 个答案:

答案 0 :(得分:1)

在不同模块之间共享逻辑的常用方法是使用__using__/1来自Kernel.use/2的回调。

defmodule SharedLogic do
  defmacro __using__(opts \\ []) do
    quote do
      defdelegate login(user), to: SharedLogic
      def logged?(user), do: SOME CODE
    end
  end

  def login(user) do
    SOME LOGIC
  end
end

现在,在您的实施中,您只需:

defmodule Admin do
  use SharedLogic
end

以上内容会将login/1logged/1函数添加到Admin模块。您的代码已经将此技术用于Phoenix.Socket,您可以检查it’s code for the inspiration

为了简单起见,我有效地省略了与@behaviour相关的内容,这些内容通常会添加到SharedLogic以使用SharedLogic对模块进行类型检查。

有关Kernel.defdelegate/2的更多信息。

答案 1 :(得分:-1)

通常可以使用宏在代码的不同部分之间共享相同的逻辑。您可以创建一个用于编写逻辑的模块,然后创建web.ex文件,如下所示

    def channel do
      quote do
       use Project.module name
      end
   end

之后,你可以在use project.web, :module name这样的地方使用它。