次のルートを作成したとします。
Router::connect('/projects/:id/quotations/:quotation_id/*',
array(
'controller' => 'quotations',
'action' => 'get_all_by_project', "[method]" => "GET"),
array(
'pass' => array('id', 'quotation_id'),
'id' => '[0-9]+',
'quotation_id' => '[0-9]+'
),
array(
'named' => array(
'name1',
'name2',
'name3'
)
)
);
このルートでは:
- 渡されたパラメーターは必須パラメーター
id
となりquotation_id
、1 番目と 2 番目に渡されたパラメーターの順序に従います。
- 名前付きパラメーターは、オプションのパラメーター
name1
、name2
、および になりname3
ます。
- もちろん、クエリ パラメータもオプションであり、URL に実際に含まれているものによって異なります。
- 名前付きパラメーターが通過できるように、最後にアスタリスクが必要です
次のきれいな URL と同じアクションの醜い URL を想定してみましょう。
/projects/1/quotations/23/name2:value2/name3:value3/name1:value1?note=abc&test=123 (pretty)
/quotations/get_all_by_project/1/23/name2:value2/name3:value3/name1:value1?note=abc&test=123 (ugly)
答えの最初の部分:クエリ パラメータnote
を削除するシナリオだけを考えてみましょう。
戻るべきだ
/projects/1/quotations/23/name2:value2/name3:value3/name1:value1?test=123 (pretty)
/quotations/get_all_by_project/1/23/name2:value2/name3:value3/name1:value1?test=123 (ugly)
次のComponentメソッドが機能します。醜いURLときれいなURLの両方でテストしました。
public function removeQueryParameters($parameters, $here = '') {
if (empty($here)) {
$here = $this->controller->request->here;
}
$query = $this->controller->request->query;
$validQueryParameters = array();
foreach($query as $param=>$value) {
if (!in_array($param, $parameters)) {
$validQueryParameters[$param] = $value;
}
}
$queryString = $this->_reconstructQueryString($validQueryParameters);
return $here . $queryString;
}
protected function _reconstructQueryString($queryParameters = array()) {
$queryString = '';
foreach($queryParameters as $param => $value) {
$queryString .= $param . '=' . $value . '&';
}
if (strlen($queryString) > 0) {
$queryString = substr($queryString, 0, strlen($queryString) - 1);
$queryString = '?' . $queryString;
}
return $queryString;
}
これは、Component メソッドを呼び出す方法です。
$newUrl = $this->RequestExtrasHandler->removeQueryParameters(array('note'));
RequestExtrasHandler
上記のメソッドを持つ、私が書いたコンポーネントの名前です。
答えの 2 番目の部分:名前付きパラメーターname2
を削除するシナリオのみを考えてみましょう。
戻るべきだ
/projects/1/quotations/23/name3:value3/name1:value1?test=123 (pretty)
/quotations/get_all_by_project/1/23/name3:value3/name1:value1?test=123 (ugly)
次のComponentメソッドが機能します。醜いURLときれいなURLの両方でテストしました。
public function removeNamedParameters($parameters, $here = '') {
if (empty($here)) {
$here = $this->controller->request->here;
}
$query = $this->controller->request->query;
$named = $this->controller->request->params['named'];
$newHere = $here;
foreach($named as $param=>$value) {
if (in_array($param, $parameters)) {
$namedString = $param . ':' . $value;
$newHere = str_replace($namedString, "", $newHere);
}
}
$queryString = $this->_reconstructQueryString($query);
return $newHere . $queryString;
}
これは、Component メソッドを呼び出す方法です。
$newUrl = $this->RequestExtrasHandler->removeNamedParameters(array('name2'));
RequestExtrasHandler
上記のメソッドを持つ、私が書いたコンポーネントの名前です。
回答の 3 番目の部分:
渡されたパラメーターが必須であることに気付いた後、渡されたパラメーターを削除する必要があったとしても、実際にはビジネス上必要ないことがわかりました。
もう 1 つの問題は、名前付きパラメーターやクエリ パラメーターとは異なり、渡されたパラメーターにキーが存在しない傾向があることです。$this->controller->request->params['pass']
$this->controller->request->params['pass']
通常、数値インデックス付き配列の形式です。
したがって、渡された正しいパラメーターを取り出すことは非常に困難です。
そのため、渡されたパラメーターを削除するメソッドは作成しません。
詳細については、こちらのコードをご覧ください。
https://github.com/simkimsia/UtilityComponents/blob/d044da690c7b83c72a50ab97bfa1843c14355507/Controller/Component/RequestExtrasHandlerComponent.php#L89