はじめに
現在phpを使ってバックエンドの基礎を学習しています。
その中で、つまづいたポイントと対処法を記事にします。
環境
MAMP(Apache、MySQL、PHP)を使ってバックエンド開発
URLパラメーター
PHPを使ってバックエンド開発を勉強していますが、
URLの末尾に?をつけてパラメーターを渡すことで、リダイレクトした先の表示を柔軟に変更させることができます。
例えば
/hoge/bar/foo?var=1000
のようなURLにGETリクエストを送信した場合、
$_GET['var']
というグローバル変数に、1000が格納されるので、これを使って画面表示を変化させることができます。
例えば、example.view.phpに次のようなコードを記述してみます。
<?php
namespace view\example
function index($var){
?>
<span><?php echo $var?></span>
<?php
}
?>
これを使って、example.controller.phpを次のようにしてみます。
<?php
namespace controller\example
function get(){
\view\example\index($_GET['var']);
}
?>
そして、先程の
/hoge/bar/foo
にリクエストを送ると、example.controller.phpを読み込むように設定しておいたとします。
すると、
/hoge/bar/foo?var=1000
にgetリクエストを送ったときの表示画面は
1000
となり、
/hoge/bar/foo?var=500
の時は
500
になります。
つまづいたポイント
先ほど
/hoge/bar/foo
にexample.controller.phpを対応させました。
すると、パラメーターをつけた状態の
/hoge/bar/foo?var=1000
というパスは、当然のことながら/hoge/bar/fooとは別ものですので、そのまま上記のパスにgetリクエストを送ってもexample.controller.phpは読み込まれません。
そこでparse_urlを使います。
$url = parse_url('/hoge/bar/foo?var=1000');
とすると、引数に渡されたパスは、
'path' => ?より前の文字列
'query' => ?より後の文字列
のように、分割されて連想配列に格納されます。
なので、今回の場合
$url['path'] = '/hoge/bar/foo'
$url['query'] = 'var=1000'
というふうに分割されて格納されることになります。
これを、リクエストが送られてきた際に毎回実行することで、
URLパラメーターがくっついているURLに関しては$url['path']にリクエストを送るように処理を変更してやることができます。?var=1000がくっついていないのでちゃんとexample.controller.phpを読み込んでくれます。また、
$_GET['var']にはパラメーターが格納されたままなので、表示画面の変更には支障はありません。
まとめ
今回は、URLパラメーターが含まれたURLにリクエストを送ったときに、パラメーターに邪魔されずに適切なファイルを読み込めるようにする方法について紹介しました。
参考になりましたら幸いです。