32339
URL で、一般的に Action/Controller/Value の構成でアプリを組んでいます。  
この Value はデータベース上では数値型なので、URL 自体に数値の制限を入れたいのです。

現状はたとえば /Action/Controller/123 が実在するとして、以下が同じ結果を返してしまいます。  
/Action/Controller/123aa  
Value の引数をそのまま MySQL に渡しており、前方の数値をできるだけ解析してくれる便利機能のようなのですが、今回は不要なので、Controller
または Model で制限しようと思っています。  
全部のモデルの ID が数値型なので、AppController または AppModel で判定することを考えています。  
Controller 内のすべてのメソッドで if
判定する方法はあるのですが、もっと良い方法がある気がしてなりません。他にエレガントな方法はあるでしょうか?

全国の識者の方、お教えください。
CC BY-SA 3.0
2017-02-01T09:23:26.303
32304
2017-02-03T07:14:40.357
2017-02-03T07:14:40.357
12906
12906
question
mysql cakephp
URL に指定する ID を数値型だけにしたい
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
ルーティング](https://book.cakephp.org/2.0/ja/development/routing.html#route-
elements) を読んでください。
CC BY-SA 3.0
2017-02-02T13:41:00.067
32339
2017-02-02T13:53:44.230
2017-02-02T13:53:44.230
2668
2668
32304
answer