質問: URL で、一般的に Action/Controller/Value の構成でアプリを組んでいます。 この Value はデータベース上では数値型なので、URL 自体に数値の制限を入れたいのです。 現状はたとえば /Action/Controller/123 が実在するとして、以下が同じ結果を返してしまいます。 /Action/Controller/123aa Value の引数をそのまま MySQL に渡しており、前方の数値をできるだけ解析してくれる便利機能のようなのですが、今回は不要なので、Controller または Model で制限しようと思っています。 全部のモデルの ID が数値型なので、AppController または AppModel で判定することを考えています。 Controller 内のすべてのメソッドで if 判定する方法はあるのですが、もっと良い方法がある気がしてなりません。他にエレガントな方法はあるでしょうか? 全国の識者の方、お教えください。
回答: URLパラメータの値を制限したい場合は、ルーティングによって行う方法があります。 `app/Config/routes.php` を修正します。 例えば、URL `/posts/view/123` は許可し、 `/posts/view/123abc` を許可しないのであれば、 ``` Router::connect('/posts/:action/:id', [], ['id' => '[0-9]+']); ``` のように`Router::connect()`の第3引数にパラメーターの制限を正規表現で記述します。 質問にある `/Action/Model/123` のようなルーティングであれば、 (注: URLのModelは`Controller`のことと解釈して回答します。) ``` Router::connect('/:action/:controller/:id', [], ['id' => '[0-9]+']); ``` のようなルーティング設定となるでしょう。 なお、これらの設定を行う場合、CakePHPコアのルーティング設定が有効だと競合し、意図しない動作となる可能性があります。 `app/Config/routes.php`中に以下のような記述がある場合は、require文はコメントアウトして、CakePHPコアの`routes.php`から必要なルーティング設定を抜き出して設定してください。 ``` require CAKE . 'Config' . DS . 'routes.php'; ``` 詳しくは、 CakePHP 2.x Cookbook ルーティング を読んでください。