人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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のような形にしたいと思っています。
よろしくお願いいたします。

●質問者: esecua
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:CakePHP INDEX mod_rewrite NG PHP
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● b-wind
●13ポイント

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 を表示させる

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

◎質問者からの返答

そこまではOKなんです。

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

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

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

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

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


2 ● b-wind
●1ポイント

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

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

なるほど。

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

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

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


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

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

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

◎質問者からの返答

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


3 ● tdoi
●74ポイント

この説明で参考になるか分かりませんが、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の中で同じような仕組みで画面を生成しています。


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


4 ● sphire
●2ポイント

RewriteEngine On

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

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

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

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

◎質問者からの返答

、、、、、


5 ● sphire
●10ポイント

すみません

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


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

とか?

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ