CakePHP 3.0 クエリ文字列パラメータと渡されたパラメータ
-
21-12-2019 - |
質問
CakePHP 3.0 では、他のアプリケーション フレームワークとインラインで使用される標準のクエリ文字列パラメータを優先して、名前付きパラメータが削除されました (ありがたいことに)。
ただし、まだ頭を理解するのに苦労しているのは、他の MVC フレームワーク、たとえば ASP.NET では、ActionResult (関数と同じ) でパラメーターを渡すことになることです。
Edit( int id = null ) {
// do stuff with id
}
そして、そのメソッドには次のようなクエリ文字列として ID が渡されます。 /Edit?id=1
ルーティングを使用すると、次のようになります。 /Edit/1
.
ただし、CakePHP では、関数パラメータ内で渡されるものは次のようになります。
function edit( $id = null ) {
// do stuff with $id
}
次のように、渡されたパラメータとして実行する必要があります。 /Edit/1
これにより、クエリ文字列のアイデアが回避され、URL を改善するためのルーティングの必要性も回避されます。
その編集のリンク内のパラメータに次のような名前を付けるとします。
$this->Html->link('Edit', array('action' => 'edit', 'id' => $post->id));
次に、次のことを行う必要があります。
public function edit() {
$id = $this->request->query('id');
// do stuff with $id
}
渡されたパラメータIDを取得します。CakePHP 3.0 の ASP.NET のような関数でそれが検出されると考えられますが、そうではありません。
私は、単に値を渡すのではなく、編集リンクで渡された値にプレフィックスを付けることを好みます。これにより、相手側で序数をあまり気にする必要がなくなり、それらが何であるかなどがわかります。
CakePHP のメソッドにデータを渡すこれらの方法のいずれかを試してみて、物事を行う正しい方法と、バージョン 3.0 の変更によってこの領域がどのように改善されるかについて、より多くの光を当てることができる人はいますか...
解決
CakePHP 3.0 にはいくつかの種類のリクエストパラメータがあります。それらを確認してみましょう:
クエリ文字列:でアクセスされます $this->request->query()
, 、コントローラ関数に引数として渡されないため、リンクを作成するには次のことを行う必要があります。 Html->link('My link', ['my_query_param' => $value])
渡された引数:特別なタイプの引数は、コントローラ関数によって引数として受け取られるものです。これらは引数として、または検査することによってアクセスされます。 $this->request->params['pass']
. 。ルートに応じて渡された引数を使用してリンクを構築しますが、デフォルトのルートの場合は、次のような位置パラメータをリンクに追加するだけです Html->link('My link', ['action' => view, $id, $secondPassedArg, $thirdPassedArg])
リクエストパラメータ:渡される引数は、この引数のサブタイプです。リクエストパラメータは、ルートから抽出できる情報のうち、リクエスト内に存在できる値です。パラメータは、存続期間中に他のタイプのパラメータに変換できます。
次のルートを考えてみましょう。
Router::connect('/articles/:year/:month/:day', [
'controller' => 'articles', 'action' => 'archive'
]);
そのルートで 3 つのリクエスト パラメータを効果的に作成しました。 year
, month
そして day
そしてそれらは次のようにアクセスできます $this->request->year
$this->request->month
そして $this->request->day
. 。このためのリンクを構築するには、次のようにします。
$this->Html->link(
'My Link',
['action' => 'archive', 'year' => $y, 'month' => $m, 'day' => $d]
);
ルートではこれらのパラメーターを指定するため、クエリ文字列パラメーターとして変換されないことに注意してください。これらを渡された引数に変換したい場合は、代わりにこのルートを接続します。
Router::connect('/articles/:year/:month/:day',
['controller' => 'articles', 'action' => 'archive'],
['pass' => ['year', 'month', 'day']]
);
コントローラー関数は次のようになります。
function archive($year, $month, $day) {
...
}