質問: ┌index.php ┝project01 │┝video.mp4 │┝music.mp3 │└doc.pdf ┝project02 │┝video.mp4 │┝music.mp3 │└doc.pdf ┝project03 │┝video.mp4 │┝music.mp3 │└doc.pdf ・ ・ ・ まったく同じレイアウト、中身だけが変わるウェブサイトを制作する際に、もしPHPを使って動的にページをつくるとしたらどのようにな実装をするのでしょうか? それぞれのディレクトリにindex.htmlを入れる方法をとらず、簡単にしたいと考えています。 感覚的にはpython Djangoのurls.pyのように、urlから数字の値をとってきてview内で再利用できる仕組みがPHPにもあるのかなと思っています。
回答: > > urlから数字の値をとってきてview内で再利用できる仕組みがPHPにもあるのかなと思っています。 > > > 「ある」というより「そういう仕組みを作る」ということになります。 `?id=1234`のようなクエリストリングで、$_GETで受け取っても良いですし、 teratailのような`/questions/190418`でも良いですが、 それは「こういうURLのときはこういう処理をする」という組み方をするだけの話で、 そこは仰っている「Djangoのurls.py」とやっていることは同じだと思います。 どちらもサーバーサイドの言語なので「URLをリクエストとして受け取ってそのURLに即した処理をする仕組みを”自分で作る”」ことに変わりはありません。 先に例を出したteratailですが、PHPで作られています。 既存のPHPフレームワークである[CakePHP]を利用して作られているということは割と知られています。 CakePHPは私もまだ業務で使ったことがあるほどのレベルではないですが、 「ルーティング」という考え方によって「こういうURLがきたらこの処理を実行する」と指定して処理をさせています。 「こういうURL」の部分も、1番目がカテゴリ名、2番目がID・・・のように「約束事」を決めるわけですね。 指定の構造で、「クエリストリング」で実装する場合、例えばこんな感じでしょうか。 ※とりあえずpdfだけリンクにするという形にしています。 ``` $project = $_GET['project'] ?? ''; if(!empty($project) && file_exists('project'.$project) && file_exists('project'.$project.'/doc.pdf')){ echo 'PDF'; } ``` これでURLで`https://example.com/?project=01`のようにアクセスすればproject01配下のdoc.pdfのリンクが生成できるような形になるわけですね。 `/questions/190418`のような形(今回だと/project/01のような形)を実装しようとすると「全てのアクセスをindex.phpに集めるように指定し、index.phpを読み込んだ時にURLを解析して結果で使う処理を振り分ける」といった対応になります。 以前の質問に私も同じような内容で回答していました。 :htaccessを使って拡張子.phpのファイルにアクセスした時に、.phpをとってページを表示させたい。 いずれにしてもhtaccessというものを利用する必要があります。(こういう記事にも紹介されています) 「オレオレフレームワークを作る」というのも勉強にはなるかもしれませんが、手っ取り早く対応するのであれば既存のフレームワークを採用したほうがいいかもしれません。 (採用するフレームワーク次第ではきちんとPHPを学んでおかないといけないものも多いですが)