2017-12-06 3 views
1

Mein user_socket bekommtWie Berechtigungslogik auf der Basis Thema in einem Phoenix-Kanal hinzuzufügen, damit alle untergeordneten Themen haben die gleiche Logik

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 

Hier i zwei Berechtigungsstufe implementieren, dh öffentlichen und Admin. Alle Unterzweige unter diesen beiden Themen müssen dieselbe Berechtigungslogik erben, die für das übergeordnete Thema festgelegt wurde. Wie erreiche ich das? oder mache ich etwas falsch? (wirklich neu in der funktionalen Programmierung)

+0

Erstellen Sie ein separates Modul mit der gemeinsamen Logik und rufen Sie dies innerhalb jeder Kanal 'join/3' Funktion auf? –

+0

aber ich muss es in jedem Join/3-Funktionen aufrufen ... wenn ich diese Logik auf Basistopic anwenden könnte und wenn alle Unterthema geerbt wird, wäre das nett :) –

+0

Dann erstellen Sie eine 'MyApp.AdminSocket' und legen Sie Ihre Logik in der Funktion 'connect/2'. Dann erzähle nur über die Admin-Kanäle und behalte deine 'MyApp.UserSocket', um nur über die öffentlichen Kanäle zu wissen. –

Antwort

1

Der übliche Ansatz, um die Logik zwischen verschiedenen Modulen zu teilen, wäre __using__/1 Rückruf von Anrufen zu Kernel.use/2 zu verwenden.

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 

Und jetzt in Ihre Implementierungen tun Sie gerade:

defmodule Admin do 
    use SharedLogic 
end 

Die obige login/1 und logged/1 Funktionen Admin Modul hinzufügen. Ihr Code verwendet diese Technik bereits für Phoenix.Socket, Sie können it’s code for the inspiration untersuchen.

ich die @behaviour -related Sachen effektiv weggelassen, das heißt in der Regel zu SharedLogic hinzugefügt, um die Module mit SharedLogic, aus Gründen der Einfachheit typ zu überprüfen.

Weitere Informationen über Kernel.defdelegate/2.

-1

In der Regel können Makros verwendet werden, um die gleiche Logik zwischen verschiedenen Teilen des Codes zu verwenden. Sie können ein Modul machen, in dem Sie Ihre Logik schreiben und dann in der web.ex Datei wie diese

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

Danach können Sie diese, wo jeder wie diese use project.web, :module name verwenden können.

Verwandte Themen