ホリデープログラミング入門

一言メッセージ :ホリデーにプログラミングを楽しむための入門 by 船木信宏

  • お気に入りブログに登録

PHP

[ リスト ]

[memovie] 自作フレームワークについてとフォームからのPOST

自作フレームワークについてとフォームからのPOST



memovie.orgのコーディングです。今まで触れてこなかったフォームでのデータのやりとりについて書いてみます。

最新のソースを入手する


http://coderepos.org/share/browser/websites/memovie.org/trunk
ここにmemovie.orgのソースはアップしてあります。

Subversionの使える環境で上記のようにコマンドを打てばダウンロードできます。一度ダウンロードしたらsvn upとすれば最新のソースがダウンロードされます。

自作フレームワークの基本的な動き


まず必要な設定は、public/をapacheのドキュメントルートにすること。
例えばsvn checkupを/home/funaki/work/で実行した場合、こんな具合。.htaccessも有効にしておきます。
DocumentRoot "/home/funaki/work/memovie.org/trunk/public"
AllowOverRide All
続いてPHPの設定。apacheの設定ファイルに記述するのであれば
php_value include_path '.:/home/funaki/work/memovie.org/trunk/'
とtrunkにパスを通しておきます。php.iniの設定は、CentOSなどにPHPを入れた際のデフォルトを想定していますがmagic_quotesはOffです。
magic_quotes_gpc = Off

.htaccessにmod_rewriteの設定があるので、僕の環境の場合、
http://memovie/
にアクセスするとpublic/index.phpが呼び出されます。(apacheのVirtualHostで ServerName memovie としつつアクセスするクライアントの/etc/hosts で127.0.0.1 memovieを指定。Windowsでもhostsの設定でできます)

public/index.phpのソースを見るとControllerがnewされてexecute()を呼び出しています。
lib/Controller.phpのfunction execute()ではあれこれ処理が施されていますが、URLの/以下によって呼び出すクラスを変える、というものです。

http://memovie/post
ならapp/controllers/Post.phpを呼び出す、といった具合です。呼び出してexecute()した返り値はapp/views/post.phpで出力できます。

複雑なファイル構成になっていますがこれは、PHPの各ファイルとその役目を明確に分けるための仕組みです。app/controllers/ にはメインの処理を、app/views/ には出力部分(HTML)を、まだ登場していませんがapp/models/ にはデータベースとのやりとりを記述します。MVCモデルと呼ばれ、近年のスタンダードなフレームワークの手法です。詳細が気になる方は検索してみてください。

POSTを受け取る


さて、ウェブサイトの多くではHTMLの<form>を使ってデータをサーバに送信します。
<form action="" method="post">
<input type="text" name="test">
<input type="submit" />
</form>
これが基本的なフォームを表示するためのHTMLです。methodにgetを指定するとURLの後ろに?マークが付き、それ以降にinputの数に応じて引数が続くようになります。postだと、URLには出てきませんがinputの内容を送信できるようになります。URLは長さ制限があるのでpostを使うのが普通です。

<?php
print_r($_POST);
?>
<form action="" method="post">
<input type="text" name="test">
<input type="submit" />
</form>
PHPでPOSTで送られてきたデータは$_POSTに入っています。$_POSTはスーパーグローバル変数というどこからでも使える変数です。

上記のようにaction=""と空にすると同じファイルにアクセスすることになり、フォームに入力した文字列がprint_rで出力されるわけです。<input type="text" name="test2">と増やしたりいろいろやってみてください。

ちなみにフォームでsubmitしたとき以外はprint_rの結果は空の配列。submitしたとき以外は表示しないようにしたければ、
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
を使います。ブラウザでF5を押すなどしてリロードするとPOSTの内容が再送されます。再送したくないときはアドレス欄にフォーカスを当ててEnterを押せばOK。

フレームワーク上で$_POSTをprint_rする


memovie.orgでは app/views/index.php にフォームが記述してあります。
http://memovie/
にアクセスしたときにapp/controllers/Index.phpから呼び出されています。

このフレームワークでは lib/Request.phpの59行目で$this->params['post']に代入して、$this->paramsをcontrollersのexecute()に引数で与えてあります。$_POSTを直接使ってもよいですが、処理を一元化するために使っています。

app/views/index.php のフォームでactionを/post に指定したので app/controllers/Post.phpが呼ばれます。executeにprint_rがあると思いますが、ここで出力しているのが先ほどの$this->params。

データの流れはこのような感じです。


次回


今回のソースはだいたい以下から見れます。
http://coderepos.org/share/changeset/6327

次回は取得したPOSTのデータをデータベースにINSERTする部分を。

閉じる コメント(2)

顔アイコン

とても勉強になっています、ありがとうございます。

勝手に勉強させてもらっている身で質問するのは大変恐縮なのですが、一つ質問させてもらえないでしょうか。

>http://memovie/
>にアクセスするとpublic/index.phpが呼び出されます。

私の環境では上記のアクセスではpublic/index.phpが呼び出されず、memovie/publicまでアクセスしないと、index.phpが呼び出されないのですが、何かapatchのhttpd.confで設定しなければいけないのでしょうか。
もしするならば、何を設定するのか教えていただけないでしょうか。 削除

2008/3/18(火) 午後 9:56 [ toshio ]

顔アイコン

役に立って何よりです。

DocumentRootの設定が影響していると思われます。
いかがでしょうか。

2008/3/19(水) 午前 9:20 [ funaki ]

コメント投稿
名前パスワードブログ
投稿

閉じる トラックバック(0)

トラックバックされた記事

トラックバックされている記事がありません。

トラックバック先の記事

  • トラックバック先の記事がありません。

.
検索 検索

funaki
人気度

ヘルプ

  今日 全体
訪問者 15 208663
ファン 0 198
コメント 0 83
トラックバック 0 35
  • My Yahoo!に追加
  • RSS
  • RSSとは?

開設日: 2005/2/1(火)


プライバシーの考え方 -  利用規約 -  ガイドライン -  順守事項 -  ヘルプ・お問い合わせ

Copyright (C) 2009 Yahoo Japan Corporation. All Rights Reserved.