0

コントローラー/アクションの前に名前付きパラメーターを配置し、その後に続く他のすべてのものを配置したい...

例えば:

domain.com/named_parameter/controller
domain.com/named_parameter/controller/action
domain.com/named_parameter/controller/action?key=val
domain.com/named_parameter/controller/action/other_params

の後の URL の残りの部分がどのように構成されるかは気にしませんnamed_parameter。パラメータを前に置きたいだけです:)

また、名前付きパラメーターを前に付けずに標準の URL を機能させる必要もあります。

例えば:

domain.com/controller
domain.com/controller/action
domain.com/controller/action?key=val
domain.com/controller/action/other_params

簡単にするために、名前付きパラメーターは、で始まる場合にのみ一致しますfoo_

例えば:

domain.com/foo_biz/controller/action
domain.com/foo_zip/controller/action

マッチングは可能ですか?はいの場合、どのように?

4

1 に答える 1

2

それはすべてクックブックで説明されています。

名前付きパラメータ (CakePHP 3.0 で削除されたので、今日はもう使用をやめた方がよいでしょう) について実際に話しているようには見えませんが、それらはname:value形式にあるため、単に通常のパスコンポーネントについて話しているだけです。

独自のルート要素を簡単に定義し、正規表現一致オプションを使用して、要素が で始まる URL にのみルートが接続されるようにすることができますfoo_:controllerおよび要素を使用すると、ルートはパス コンポーネント:actionのないコントローラー/アクションと同じコントローラー/アクションに接続されます。foo_

ルートを他のルートの前に配置して、それらが優先されるようにします。

$options  = array(
    'store' => 'foo_[^\/]+', // matches everything that starts with `foo_`
    'persist' => array('store')
);

/**
 * Connects:
 *
 * /foo_storename/controller/action
 * /foo_storename/controller/action/whatever/etc...
 * /foo_storename/controller/action?bar=baz&etc...
 */
Router::connect(
    '/:store/:controller/:action/*',
    array(),
    $options
);

/**
 * Connects:
 *
 * /foo_storename/controller
 * /foo_storename/controller?bar=baz&etc...
 */
Router::connect(
    '/:store/:controller',
    array('action' => 'index'),
    $options
);

/**
 * Connects:
 *
 * /foo_storename
 * /foo_storename?bar=baz&etc...
 */
Router::connect(
    '/:store',
    array('controller' => 'index', 'action' => 'index'),
    $options
);

store次に、コントローラーのリクエストオブジェクトで、魔法のようにリクエストオブジェクトのプロパティとしてアクセスできます。

$this->request->store;

またはプロパティで明示的にparams

$this->request->params['store'];
于 2013-10-03T16:06:24.220 に答える