以下を実現する方法を教えて下さい。


publich/
|
+---script/
|
+---poll/

というディレクトリ構成になっています。

行いたいことは http://poll/thankyou

にアクセスした際、poll下にあるindex.phpがthankyouという引数を読み込み、public/script にある view__thankyou.php を表示させるにはどうすればいいのでしょうか?ちなみに、 http://poll/thankyou?hoge=value とthankyouの後についた引数もしっかり渡せるような物をお願いいたします。

ちなみに mod_rewrite 使用可能環境です。
ただ単に一つ一つmod_rewriteで指定するのはNGです。poll下アクセスした瞬間、何らかの引数として取り扱い、viewを取り出してくる構造です。

CakePHPのような形にしたいと思っています。
よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:2008/12/11 10:31:56
  • 終了:2008/12/17 10:00:53

回答(5件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402008/12/11 13:37:02

ポイント13pt

http://poll/thankyou じゃなくて http://www.example.com/poll/thankyou の typo ですよね?

poll下にあるindex.phpがthankyouという引数を読み込み

この部分は mod_rewrite で書けば実現できる。

RewriteEngine On
RewriteRune ~/poll/([a-zA-Z0-9]+)$ /poll/index.php?hoge=$1 [QSA,L]

public/script にある view__thankyou.php を表示させる

この部分はいまいち意味をとりかねたのでもうちょっと詳しく。

id:esecua

そこまではOKなんです。

やりたいことはcakephpのように別のフォルダにあるファイルを引数から判断し、そのファイルに記載されている情報を表示したいと考えています。

通常フレームワークのURL /controler/viwer/引数 のような形になります。しかし、毎回毎回htaccessにファイル先を記載するわけでもありません。Cakeの場合は、3つのhtaccess配置だけです。

で、渡しの場合ですが、mod_rewriteでindex.phpに$1を渡し、$1からview__$1を読み込み表示させたいのですが、その部分をどうしようか迷っています。

単にinclude()すればいいのでしょうか?

一般に使用されているフレームワークはどのようにしてこのロジックを構成しているのでしょうか?

2008/12/11 13:56:36
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402008/12/11 14:11:11

ポイント1pt

で、渡しの場合ですが、mod_rewriteでindex.phpに$1を渡し、$1からview__$1を読み込み表示させたいのですが、その部分をどうしようか迷っています。

単にinclude()すればいいのでしょうか?

なるほど。

CakePHP は知らないので同じ動作とはいかないが、index.php 内で処理の分岐等がなければ単なる include でいいと思う。

ただし受け取った引数はちゃんとチェックしないとなんたらインジェクション(PHP の場合の名称不明)の類のセキュリティーホールになる。

ついでに言うと view は DocumentRoot の外(外部から直接実行できないところ)に配置した方がいいね。


一般に使用されているフレームワークはどのようにしてこのロジックを構成しているのでしょうか?

細かいところは千差万別。ただし、PHPである以上どこかでは include/require は行うことになる。

そういう細かいところはたぶんいちいち説明を受けるよりソース読んだ方が早い。

id:esecua

もうちょっと詳しく説明してほしかった、とくにCake,,,,

2008/12/11 16:17:36
id:tdoi No.3

tdoi回答回数174ベストアンサー獲得回数752008/12/12 01:30:52

ポイント74pt

この説明で参考になるか分かりませんが、cakePHPの動作の処理の概要は以前にブログに書いたことがあるので、参考にしてみてください。

http://www.fr-soft.com/cake/archives/8


その上で、表示部分の処理をどうしているかですが、もう少しソースレベルで追っかけるのであれば、

Dispatcher::_invokeの中で、Controller::render()を呼び出します。

Controller::render()の中で、Viewのインスタンスを作成し、View::render()を呼び出します。

View::render()では、Controllerによって指定された情報をもとに、layoutや、viewのテンプレートファイルを特定します。

その特定したファイル名を、View::_render()の中で処理した結果が出力される画面のHTMLとなります。


興味をもたれているのが、識別子からのHTMLの作成のところと思いますが、

viewのテンプレートファイル名の取得は、どのようにファイルを配置したいかによるので、期待するように指定すればよいかなと思います。

そして、このView::_render()でファイルからの読み込みは、おおよそ次のようになっています。

ob_start();
include (ファイル名);
$out = ob_get_clean();

また、やりたいことがよく分かりませんが、ページをパラメタで切り替えたいだけならば、smartyなんかを使ったほうが簡単かと思います。

Smartyでも、Smarty::displayから呼び出されるSmarty::fetchの中で同じような仕組みで画面を生成しています。


とは言え、このあたりの仕組みを理解したいのであれば、ソースを読むことをお勧めします。

id:sphire No.4

sphire回答回数115ベストアンサー獲得回数122008/12/14 02:11:11

ポイント2pt

RewriteEngine On

RewriteRule poll/[0-9a-zA-Z]+$ poll/index.php [QSA,L]

としておいて、$_SERVER['PATH_INFO'] とかを使います。

/ でexplodeして、あとは自由にどうぞ。

もちろん、元々のGETパラメータは$_GETでアクセス可能です。

id:esecua

、、、、、

2008/12/15 15:48:48
id:sphire No.5

sphire回答回数115ベストアンサー獲得回数122008/12/14 02:16:38

ポイント10pt

すみません

view__thankyou.php を表示する話を忘れてました。


$path = $_SERVER['PATH_INFO'];
list($dummy, $page, $dummy) = explode('/', $path);
$inc = "../script/view__{$page}.php";
if(is_readable($inc)){
  require($inc);
}

とか?

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません