1

Mason::Plugin::RouterSimpleを使用してページ コンポーネントのルートを指定する方法を知っています。たとえば、次の URL が与えられます。

/archives/2015/07

次のようにコンポーネントを作成できますarchives.mc

<%class>
  route "{year:[0-9]{4}}/{month:[0-9]{2}}";
</%class>
Archives for the month of <% $.month %>/<% $.year %>

同様にnews.mc、次の URL を処理するコンポーネントを作成できます。

/news/2012/04

それは問題ありません(そして非常にエレガントです!)が、今私が欲しいのは、次のようなURLを処理できるようにすることです:

/john/archives/2014/12
/john/news/2014/03
/peter/news/2015/09
/bill/archives/2012/06

ルートルールを次のように記述できることはわかっています。

<%class>
  route "{user:[a-z]+}/archives/{year:[0-9]{4}}/{month:[0-9]{2}}", { action=> 'archives' };
  route "{user:[a-z]+}/news/{year:[0-9]{4}}/{month:[0-9]{2}}", { action=> 'news' };
</%class>

ただし、リクエストは 2 つの異なるコンポーネントで処理する必要があります。リクエストを別のコンポーネントにルーティングするにはどうすればよいですか? archives.mcコンポーネントの名前の前にユーザー名があるため、Mason では一致しnews.mcません。

4

1 に答える 1

1

問題は、urs likeはコンポーネントで/archives/2014/12簡単に処理できますが/archives.mc、urls like については、archives コンポーネントをどこに置くべきかが明確でないことです/john/archives/2014/12/bill/archives/2012/06

Mason は次のコンポーネントを照合しようとします (これは簡略化されたリストです。Mason::Manual::RequestDispatchを参照してください)。

...
/john/archives.{mp,mc}
/john/dhandler.{mp,mc}
/john.{mp,mc}

しかし最後に...

/dhandler.{mp,mc}

dhandler.mcだから私の考えは、コンポーネントをルートディレクトリに置くことです:

<%class>
  route "{user:[a-z]+}/archives/{year:[0-9]{4}}/{month:[0-9]{2}}", { action=> 'archives' };
  route "{user:[a-z]+}/news/{year:[0-9]{4}}/{month:[0-9]{2}}", { action=> 'news' };
</%class>
<%init>
  $m->comp($.action.'.mi', user=>$.user, year=>$.year, month=>$.month);
</%init>

URL が最初のルートと一致する場合、archives.miコンポーネントが呼び出されます。

<%class>
  has 'user';
  has 'year';
  has 'month';
</%class>
<% $.user %>'s archives for the month of <% $.month %>/<% $.year %>

.miコンポーネントを使用したため、内部でのみアクセスできます)。

dhandler は改善される可能性があります (より良い正規表現、データベース テーブルからユーザーをチェックし、要求を拒否するなど)。

私のアーカイブとニュース コンポーネントは POST/GET データを受け入れることができるので、任意のデータを受け入れたいので、次のようにすべてを渡すことができます。

 $m->comp($._action.'.mi', %{$.args});

エレガントすぎませんが、機能しているように見えます。

于 2015-09-02T20:09:53.173 に答える