0

以前、貪欲なスターで CakePHP のルーティング機能を使用して、URL 内のすべての追加引数を要求されたコントローラーにプッシュできるようにしました。これは正常に動作し、HTML ヘルパーでは期待どおりです。

CakePHP の本を参照すると、末尾のスター構文 (2 つのワイルドカード、**) は同じ操作を実行しますが、追加のすべての引数を 1 つの文字列に結合します。これは、このメソッドを使用する URL に直接アクセスした場合にもうまく機能しますが、以下に示すように、HTML ヘルパーは引数を 2 倍にしているようです。

Router::connect(
  '/view/**', 
  array('controller' => 'thing', 'action' => 'view')
);

$this->Html->link(
  'title here', 
  array('controller' => 'thing', 'action' => 'view', 'abc', 'def'
));

http://website.com/thing/view/abc/defabc/def

あるべきなのに

http://website.com/controller/view/abc/def

4

1 に答える 1

1

/**、照合用ではなく、解析用です。解析とは、URL の文字列バージョンを取り、Cake がリソースを指すために使用する配列に変換することです。一方、マッチングとは、配列ベースの URL を取得し、ルートに基づいた文字列に変換することです。

Router::connect(
  '/view/**', 
  array('controller' => 'thing', 'action' => 'view')
);
// input
Router::parse('/view/something/here/for/you');
// output
array(
  'controller' => 'thing',
  'action' => 'view',
  'pass' => array('something/here/for/you'),
  'named' => array()
);

// input
Router::url(array(
  'controller' => 'thing',
  'action' => 'view',
  'something',
  'here'
));
// output
/view/something/heresomething/here

// input
Router::url(array(
  'controller' => 'thing',
  'action' => 'view',
  'something/here'
));
// output
/view/something%2Fheresomething%2Fhere

2 番目と 3 番目の例は明らかに正しくありません。ルーターのバグだと思います。/**URL が正しく構成されていたとしても、それを解析することは不可能something/heresomething/hereです。

回避策として、渡されたすべての引数を除外して、リンクの前に追加できます。

$url = Router::url(array('controller' => 'thing', 'action' => 'view'));
$this->Html->link(
  'title here', 
  $url . 'abc/def'
));
// ends up: /view/abc/def

その後abc/def、渡された単一の引数に解析されます。

于 2012-10-12T01:18:18.157 に答える