2016-09-26 5 views
3

매번 호출하는 플러그가 몇 개 있습니다. 모든 것을 나를 위해 호출하는 단일 플러그를 만들고 싶습니다. 그 일을 어떻게 하죠? 플러그 내에서 플러그를 호출하십시오.

내가 현재 할 시도한 것입니다 :

defmodule MyApp.SpecialPlug do 
    import Plug.Conn 

    def init(default), do: default 

    def call(conn, default) do 
    plug SimplePlug1 
    plug SimplePlug2, args: :something 
    end 
end 

을하지만 말을하는 CompileError 던졌습니다 : undefined function plug

답변

8

당신은 단순히 이것에 대한 Plug.Builder를 사용할 수 있습니다

defmodule MyApp.SpecialPlug do 
    use Plug.Builder 

    plug SimplePlug1 
    plug SimplePlug2, args: :something 
end 

그러면 initcall이 자동으로 지정되어를 순차적으로 통과합니다. 그리고 나서 SimplePlug2.

defmodule MyApp.SpecialPlug do 
    def init({opts1, opts2}) do 
    {SimplePlug1.init(opts1), SimplePlug2.init(opts2)} 
    end 

    def call(conn, {opts1, opts2}) do 
    case SimplePlug1.call(conn, opts1) do 
     %Plug.Conn{halted: true} = conn -> conn 
     conn -> SimplePlug2.call(conn, opts2) 
    end 
    end 
end 

주 당신이 원하는 않는 한 (위와 halted: true 자신을 검사를 추가해야합니다 : 당신이 정말 수동으로 플러그인을 호출 할 경우


, 당신은 이런 식으로 뭔가를 할 수 웬일인지 중단을 무시하는 것). 당신이 지금 할 수있는

plug SimplePlug1 
plug SimplePlug2, args: :something 

:

plug MyApp.SpecialPlug, {[], [args: :something]} 
+0

최고 Plug.Builder는 동등한를 얻으려면 자동으로

당신을 위해 동일하지 않습니다! 감사. 이것은 내 문제를 해결하지만 또 다른 질문은 : 어떻게 플러그인 (비 플러그) 코드로 다른 플러그를 작성하기 위해 Plug.Builder를 사용할 수 있습니까? 즉, 플러그의'call/2' 메소드 내에서'plug/1' 메소드를 사용할 수 있습니까? – Sheharyar

+1

'SimplePlug1'과'SimplePlug2' 사이에'plug : hello'를 통해 자신 만의 구현체를 연결하고'hello/2'를 정의 할 수 있습니다. 아니면'call/2' 함수 안에 코드에 기반한 플러그를 추가하고 싶습니까? –

+0

당신의'hello' 예제는 이것을하는 좋은 방법처럼 보입니다. 그러나 여전히'call/2' 내부에서 플러그를 호출하고, 그것으로 무언가를하고, 새로운'conn'에서 또 다른 플러그를 호출하는 것이 궁금합니다. – Sheharyar

관련 문제