Mason2を使用して Web サイトを構築します。各ページは 3 つのフィルター (コンテンツによって呼び出されるメソッド) を呼び出す必要があります。
<% $.filter1(args...) {{ %>
<% $.filter2(args...) {{ %>
<% $.filter3(args...) {{ %>
これらのフィルター (メソッド) の 3 つの異なる実装があります。これら 3 つのフィルタのデフォルト セットは、最上位/Base.mc
コンポーネントで定義されています。
ここで、サイトの別の部分 (別のルート) について、
/a/all/paths>/...>
/b/.....
上記のフィルター/メソッドのデフォルト セットを使用する必要がありますが、別のルートでは、
/c/...
/d/...
/e/...
filter1
、filter2
、filter3
およびの別のセットを使用する必要があります
/x/....
/y/...
3 番目のセットを使用します。
メソッドは低レベルのコンポーネントで簡単に再定義できますが、(この質問) のようにそれを行うことは、DRY 原則を尊重しません。
/c/Base.mc
/d/Base.mc
/e/Base.mc
同じことを繰り返す必要がある 3
<%override filter1>
...
<%override filter2>
...
<%override filter3>
質問は:
- メソッドの 3 つの異なる実装を 1 回だけ記述する方法と、それらを一度に使用する方法
/set2.mi
、のようなコンポーネントを作成しようとし/set3.mi
ましたが、これらのフィルターメソッドをオーバーライドしようとし、必要に応じてそれを呼び出しまし/{c,d,e}/Base.mc
た
<& /set2.mi &>
しかし、これは機能しません。
3 つの異なるメソッドの実装を記述し、必要な deeprr で一度に呼び出す方法はBase.mc
? 出来ますか?
標準の perl では、おそらくrolesを使用するため、必要なパッケージでは次のようなものを使用します。
with 'Set1';
with 'Set2';
パッケージSet1
とSet2
必要なメソッドの実装が含まれる場所、または動的読み込みの場合はrequire ...
. Mason2 で可能なようなことはありますか、それとも繰り返す必要があり%ovverride
ますか?
これが理にかなっていることを願っています...そうでない場合は、コメントを追加してください。質問を更新してみます。
編集
たとえば、コードを短縮するために、3 つではなく 1 つのフィルターのみを使用します。
の/Base.mc
<%augment wrap><% inner() %></%augment>
% #this is the "default" MyHead filter
<%filter MyHead($arg)>
<!-- in the real code it is more complicated, but for an illustration it is enough -->
<h1 class="<% $arg %>"><% $yield->() %></h1>
</%filter>
/a/index.mc
として使用する場合
% $.MyHead('big') {{
some head text
% }}
次のように出力されます。
<h1 class="big">some head text</h1>
今、別のものを持っていMyHead
ます。
<%filter MyHead($arg)>
<!-- in the real code it is more complicated - basically want output different thing -->
<h2 id="<% $arg %>"><% $yield->() %></h2>
</%filter>
上記のコードを追加する/b/Base.mc
と動作MyHead
し、/b/index.mc
% $.MyHead('modal') {{
some other text
% }}
再定義されたフィルターを呼び出し、必要なものを出力します
<h2 id="modal">some other text</h2>
問題は、
- などのように、他の N 個の
Base.mc
コンポーネントで上記のフィルター コードを繰り返したくありません。/c/Base.mc
/d/Base.mc
- フィルタを一度書き、それを他の多くのコンポーネントで「使用」して、デフォルトのものを「再定義」する方法。