2016-09-26 18 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

関連する問題