2

私の Catalyst アクションの 1 つで、別のコントローラーで別のアクションのボディ応答 (HTML) を取得しようとしています。(あるページを別のページに「埋め込む」目的で)

これを行う方法は$c->visit. ($c->visit を誤解していた場合は、残りの質問に答える必要はありません。)

問題のアクションは引数を取りますが、次のようにチェーンのさらに下までは取りません:

/equipment/*/assets/widget


/assets/captureID (1)
-> /assets/base (0)
-> /assets/pageData (0)
=> /assets/widget

ご覧のとおり、チェーンの最後のアクションだけが arg を探しています。

私が試してみると:

$c->visit('/assets/widget',[$arg]);

チェーンをたどり、/assets/captureID に $arg を与えることを期待します。しかし、実際には、連鎖することはまったくないようです。

私はどこで迷子になったのですか?

4

2 に答える 2

1

引数ではなく、キャプチャのみがチェーンに渡されます。

ドキュメントによると:

$c->visit( $action [, \@captures, \@arguments ] )

そのため、次のことを行うことで成功することができました。

$c->visit('/assets/widget',[$arg],[$arg])

args の最初の配列は最初のアクションにヒットして停止しますが、2 番目の配列は私が望んでいたようにチェーンをずっと下に移動します。

私はうまくいくと思っ$c->visit('/assets/widget',[],[$arg])ていましたが、うまくいきません。

ただ、やっぱりそれだけでは身体の反応を掴めないということが最終目標でした。いずれにせよ、私のガチョウ追跡が誰かの役に立てば幸いです。

于 2013-02-19T00:56:04.783 に答える
1

あなたが発見したように、身体はその時点では存在しません。ビューをレンダリングするために呼び出しを行うか、 /assets/widget を$c->res->body($foo)直接設定するように手配する必要があります。控えめに言っても、サブリクエストの本文をキャプチャするというアイデアは型にはまらないと思います。優れた MVC 設計の原則に反することなく、それを使って何をしようとしているのか想像できません。

/assets/widget にあるロジックは、コントローラーではなくモデルに配置する必要があるように思えます。これにより、必要な関数で使用できるようになります。

また、テンプレートを (再利用可能な) コンポーネントに分割して、埋め込む予定のコンテンツを 1 回のレンダリング プロセスの一部として実行できるようにする必要があります。

[%- IF foo;
        PROCESS widget.tt;
    END; -%]
于 2013-02-19T04:10:53.897 に答える