cakePHPでURLをきれいにしてみた

http://localhost/cake/shops/shops?area=kanto

http://localhost/cake/shops/kanto
でアクセスできるようにしたいと思います。

before


http://localhost/cake/shops/shops?areaid=kanto

コントローラー
function index() {
echo $_GET['areaid'];
}

after


http://localhost/cake/shops/kanto

コントローラー
function index($areaid = null) {
 echo $this->params['areaid'];
}


使用方法


config/routes.php

コメントアウトして付け加えます
//Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::connect('/:areaid', array('controller' => 'shops', 'action' => 'index'));

controllerでコントローラを指定し、
actionで値を渡したいfunctionを指定すると、上記のような方法でareaidを取得でき、
URLもhttp://localhost/cake/shops/kantoとなります。

!コントローラの中ではactionをわけたりぜず、ルーティングで対処する!

なのでhttp://localhost/cake/shops/kanto/100でviewに100という値を渡したい場合は

config/routes.phpに追加
Router::connect('/:areaid/:no',array('controller' => 'shops', 'action' => 'view'));

コントローラー
function view($no = null) {
 echo $this->params['no'];
}
となります。



cakePHPでのリンクの張り方


リンクを貼るときはフルパスで書かないで、HTMLヘルパーを使用する。
これはビューで使用される。
使用するときはコントローラーに var $helpers = array('Html', 'Form'); と宣言してあげる必要がある.
bakeコマンドを使用してブロジェクとを作成すると、これは自動的に宣言されるみたいです

echo $html->link('test', array('controller'=>'shops', 'action'=>'index', 'areaid'=>'tohok'));
で、こういうタグができます↓
<a href="http://localhost/cake/shops/tohoku">test</a>



memo


・本番の環境に移行した際にプログラムの中をいじって動かす事をハードコーディングという
 →ハードコーディングはしないように心がける

・変更しなければいけない箇所をプログラム内では作らず、定数として宣言して使用するようにする
 →定数は規約にのっとり、大文字で宣言する。

  例えば
  config/bootstrap.php
  define('WWW_ROOT_URL', 'aaa');

  ビュー
  $format = 'http://%1$s/%2$s/';
  printf($format, $_SERVER['HTTP_HOST'], WWW_ROOT_URL);
  echo $format;

  出力
  http://localhost/aaa


・$_SERVER['HTTP_HOST']は現在使用しているホスト名が入っている
 pr($_SERVER);で確認できます。

・定数もcakePHPでは、すでに多数宣言されているため、もしかぶって宣言してしまった場合はエラーになる。
 ので、pr(get_defined_constants());で確認する

・コントローラーで記述すると読み込むlayoutが変更される
 $this->layout = 'test';

・setのあとにrenderを記述すると読み込むビューが変更される
 $this->set('data',$shopdata);
 $this->render('shop');

xhtmlが宣言されているところでは必ず終了タグを書く
 <br />とか