Symfoware

Symfowareについての考察blog

PHPフレームワーク「Laravel」でルーティングの使い方

PHPフレームワーク「Laravel」の使い方を調べています。
PHPフレームワーク「Laravel」でHello World!

今回はURLを制御するルーティングについて調べてみます。
http://laravel.com/docs/routing



編集するファイル



作成したプロジェクトのappディレクトリに「routes.php」があります。
これを編集して、アクセスされたURLにより、挙動を分岐させます。

447_01.png



基本的なルーティング



まずは基礎から。

トップページにアクセスした時に処理したい場合の例です。
app/routes.phpをこんな感じに編集しました。


  1. <?php
  2. Route::get('/', function()
  3. {
  4.     return 'Hello World!';
  5. });




http://[サーバーIP]/を表示すると、指定した文字列が表示されます。

447_02.png



Postの時のみ表示したい場合、「get」を「post」に変更します。


  1. <?php
  2. Route::post('/', function()
  3. {
  4.     return 'Hello World';
  5. });




getでは表示できなくなりました。

447_03.png



get、post両方許可したい場合は「match」を使用します。


  1. <?php
  2. Route::match(array('GET', 'POST'), '/', function()
  3. {
  4.     return 'Hello World';
  5. });




get、post以外のputなどすべて許可したい場合は「any」を使用します。


  1. <?php
  2. Route::any('/', function()
  3. {
  4.     return 'Hello World';
  5. });





https接続のみ許可したい場合は、こんな記載方法になるようです。


  1. <?php
  2. Route::get('foo', array('https', function()
  3. {
  4.     return 'Must be over HTTPS';
  5. }));




http接続だと、エラー画面が表示されました。



「http://[サーバーIP]/foo/bar」というURLでのアクセスにしたい場合。


  1. <?php
  2. Route::get('foo/bar', function()
  3. {
  4.     return 'Hello World';
  5. });




447_04.png



余談で、「http://[サーバー]/[ディレクトリ]」というURLを取得したい場合、


URL::to('[ディレクトリ]')



とすれば良いそうです。


こんなプログラムを書いて試してみました。


  1. <?php
  2. Route::get('/', function()
  3. {
  4.     $url = URL::to('foo');
  5.     return $url;
  6. });




狙い通りの動作です。

447_05.png





ルーティングのパラメーター取得



実際にアプリケーションを作成する際は、

http://[サーバ]/user/[ユーザーID]

のように、パラメーター付きのURLを設計すると思います。
このパラメーターの取得もルーティングに定義できます。

上記のユーザーIDを取得する例は以下のとおり。


  1. <?php
  2. Route::get('user/{id}', function($id)
  3. {
  4.     return 'User '.$id;
  5. });




idのパラメーター無しでアクセスするとエラー。

447_06.png


適当なパラメーターをつけると、自動的に値の取得が行われ
phpプログラムで利用できます。

447_07.png



パラメーターをオプション扱いにしたいときは、nullを初期値にすれば良いです。


  1. <?php
  2. Route::get('user/{name?}', function($name = null)
  3. {
  4.     return $name;
  5. });




適当な初期値を与えたい場合の例はこんな感じ。


  1. <?php
  2. Route::get('user/{name?}', function($name = 'unkown')
  3. {
  4.     return 'Hello '.$name;
  5. });




パラメーターが取得できない倍は初期値を表示します。

447_08.png


取得できた場合は、もちろん取得できた値を使用します。

447_09.png



パラメーターに制限を与えたい、例えばユーザー名はアルファベットのみ、
idは数字のみの場合は、where + 正規表現で指定できます。

例は以下のとおり。


  1. <?php
  2. Route::get('username/{name}', function($name)
  3. {
  4.     return 'User Name ' . $name;
  5. })
  6. ->where('name', '[A-Za-z]+');
  7. // 正規表現で、nameがとり得る値(アルファベット)を指定
  8. Route::get('userid/{id}', function($id)
  9. {
  10.     return 'User ID ' . $id;
  11. })
  12. ->where('id', '[0-9]+');
  13. // 正規表現で、idがとり得る値(数値)を指定




アルファベットのみ許可した「username」に数字でアクセスするとエラー。
http://192.168.1.102/username/1

447_10.png


アルファベットパラメーターだとOK。
http://192.168.1.102/username/symfo

447_11.png


数字のみ許可した「userid」に数字でアクセスするとOK。
http://192.168.1.102/userid/1

447_12.png


アルファベットだとエラーになります。
http://192.168.1.102/userid/symfo

447_13.png



whereに指定する条件は配列で複数指定できます。


  1. <?php
  2. Route::get('user/{id}/{name}', function($id, $name)
  3. {
  4.     return "User ID : {$id} Name : {$name}";
  5. })
  6. ->where(array('id' => '[0-9]+', 'name' => '[a-z]+'));
  7. // arrayで条件を複数指定



447_14.png




「数値のみ」というようなよく使用するパターンは
「Route::pattern」
を使用して事前に定義しておくと便利です。


  1. <?php
  2. Route::pattern('id', '[0-9]+');
  3. Route::get('user/{id}', function($id)
  4. {
  5.     return "User ID : {$id}";
  6. });




これで、{id}という指定箇所はすべて数値であることが要求されるようになります。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/08/10(日) 17:29:27|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<PHPフレームワーク「Laravel」でフォームの値を取得する | ホーム | PHPフレームワーク「Laravel」でHello World!>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1460-efd66a71
この記事にトラックバックする(FC2ブログユーザー)