我的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 。这两个主题下的所有子主题必须继承我设置为父主题的相同授权逻辑。怎么做到这一点?或者我做错了什么? (函数式编程真的很新)
答案 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/1
和logged/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
这样的地方使用它。