質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.23%

phpフレームワークのフロントコントローラについて

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 2,984

pato

score 30

xamppをインストールして「パーフェクトphp」という本を読み進めながらphpの勉強をしています。今やっているところは「簡単なフレームワークを作ってphpフレームワークの仕組みを学ぼう」というところなのですが、フレームワークのフロントコントローラの部分ができません。(OSはWindows10)

ドキュメントルート→C:\xampp\htdocs\miniblog.localhost\web
mini-blog.localhostディレクトリにcontrollersディレクトリ・coreディレクトリ・modelsディレクトリなどこのアプリケーションに関するすべてのファイル・ディレクトリを置いている。
webディレクトリ内に.htaccessファイルを置く。.htaccessファイルの中身は以下(本に書いてある通り)。
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
次にwebディレクトリ内にindex.phpを作成。
次にC:\xampp\apache\conf\extraa\httpd-vhosts.confファイルを開き一番下に以下のコードを追加。
NameVirtualHost *:80


<VirtualHost *:80>
    DocumentRoot "C:/xampp/htdocs/mini-blog.localhost/web"
    ServerName mini-blog.localhost
    DirectoryIndex index.php index.html

    <Directory "C:/xampp/htdocs/mini-blog.localhost/web">
    AllowOverride All
    Allow from All
    </Directory>
</VirtualHost>
次にC:\Windows\System32\drivers\etc\hostsファイルを開き一番下に次の行を追加。
127.0.0.1      mini-blog.localhost
これで、指定されたファイルが存在する場合はそのファイルを読み込み、存在しなければどんなURLであろうとすべてindex.phpにアクセスする、と説明されています。
上記設定以外のこのアプリケーションに必要なファイルはダウンロードサービスで取得できるのでそれを使い実際試した結果、
http://mini-blog.localhost/でアクセスした場合、正常に表示される。
http://mini-blog.localhost/index.phpでアクセスした場合、正常に表示される。
http://mini-blog.localhost/aaa.phpでアクセスした場合、「Web ページが見つかりません(HTTP 404) 」のエラー表示。
となります(aaa.phpというファイルは存在しない)。
そもそもどうなったら正常なのかがよくわからないのですが、これって本に書いてある意図通り動いているのでしょうか?説明を読むと、aaa.phpなど存在しないファイル・ディレクトリ名でアクセスされた場合index.phpにアクセスするように読めるのですが、そういうことではないのでしょうか?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

私も現在同じ本で学習しており、その辺が悩みどころでした。

質問の意図である
これって本に書いてある意図通り動いているのでしょうか?説明を読むと、aaa.phpなど存在しないファイル・ディレクトリ名でアクセスされた場合index.phpにアクセスするように読めるのですが、そういうことではないのでしょうか?

これはその通りです。そして存在しないファイルディレクトリ /aaa.php 等 をURLに叩くと
Application.php の runメソッド内の

HttpNotFoundException('No! route found for' . $this->request->getPathInfo());
にある文字列'No! route found for'と、指定したpathが表示されます。
で、このフレームワークはまず httpd-vhosts.conf ファイルでドキュメントルートを  /web にしているので、 mini-blog.localhost とURLを入れると、 /web の中にある index.php か index.html を見に行きます。さらにそのフォルダ内に .htaccess があり、ここではどんなURLでアクセスがあってもまず index.php を読み込みに行きなさい。という指定がしてありますので、
URLの頭に mini-blog.localhost と叩くとその後ろに何が書いてあっても。 /web フォルダ中の index.php をまず真っ先に見に行く様になっています。

そして、ここを読み込むことで連鎖的に core フォルダや models controller view とファイルを辿って、状況に応じた処理が行われるという事です。
MiniblogApplicationに配列を入れてあるのがその大本の指示ですね。

そして、想定外のURLが来た場合は先程説明した Application.php の runメソッド内の

HttpNotFoundException('No! route found for' . $this->request->getPathInfo());
が動く、という事ですね。

正直この本はいきなり7章でフレームワークを作らせるのはかなり無茶らしいです。
8章でフレームワークの使い方を学んでから、7章のフレームワークの動きを把握するのが
良い様です。
以上、ご参考になれば。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/05 20:48

    何と…w

    キャンセル

  • 2015/11/07 14:51

    解答ありがとうございました。
    phpを理解できていたら頂いた説明のように理解できるのでしょうが、もう少し説明がほしいところですよね。
    たしかに8章からやったほうかいいかもしれないです。ありがとうございました。

    キャンセル

0

mod_rewriteが設定(.htaccessに書いたもの)通り動作している場合、
aaa.phpにアクセスするとindex.phpにアクセスしたかのように動作するはずなので、
mod_rewriteが動作していない可能性があります。

XAMPPのhttpd.conf(C:\xampp\apache\conf\httpd.confあたりにあると思うのですが。)をエディタで開き、
LoadModule rewrite_module modules/mod_rewrite.so
の記述の前に#が入っていたら削除してApacheを再起動してみてください。

もしhttpd.conf内に↑の記述が見つからない場合は
httpd.conf内をmod_rewriteで検索してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/13 20:04

    解答ありがとうございました。
    LoadModule rewrite_module modules/mod_rewrite.so
    はコメントはされていませんでした。やはり動作がおかしいですよね。
    .htaccessファイルは自分で作成することはできなかった(頭が.(ドット)から始まるファイル名はつけられない)ので、ダウンロードサービスでダウンロードしたファイルを使っているのですが、これだとダメですかね?一応ファイル名は「.htaccess」ですが。

    キャンセル

  • 2015/10/14 11:04

    そうでしたか…。
    最終的にファイル名が.htaccessであれば動作すると思います。

    .htaccessが動作しているか、問題の切り分けのために確認したいのですが、
    試しに、.htaccessに構文エラーを発生させてみると
    .htaccessが有効になっているか確認できそうです。

    .htaccessの一番上に「あ」など何でも良いので
    日本語を入れてからブラウザでアクセスしてみてください。
    Internal Server Errorが表示されなければ.htaccessが
    有効になっていないということになります。

    あと一つ、今さらですが、本文中にはドキュメントルートが
    C:\xampp\htdocs\miniblog.localhost\web
    と書いてあり、
    設定ファイル中には
    C:/xampp/htdocs/mini-blog.localhost/web
    と書いてある(ハイフンの有無が異なる)のですが、実際は正しい記述になっていますか?
    ブラウザでindex.phpにアクセス出来ているので正しくなっているとは思うのですが念のため確認です。

    キャンセル

  • 2015/10/14 23:46

    解答ありがとうございます。
    私も.htaccessが有効なのかどうかはっきりしないのでそれを調べる方法をネットで質問しようと思っていたので本当にありがとうございます。たしかにそれで有効かどうかわかりますよね。
    試してみた結果日本語を入れたら

    Server error!
    サーバ内部で障害が発生し、 リクエストに応えることができませんでした。 サーバが過負荷であるか、 CGI スクリプトにエラーがあります。
    サーバーの障害と思われる場合は、ウェブ管理者までご連絡ください。
    Error 500

    となり、もとに戻したら正常に画面が表示されたので.htaccessファイルは有効のようです。
    次に2つめのご指摘については質問文の中のドキュメントルートのパスをmini-blogと書くべきところをminiblogと間違えておりました。すみませんでした。実際のディレクトリ名はmini-blog.localhostです。

    今日cakephpの本を読んでて気になったのですが、その本に「rewriteモジュールを使えない環境の場合は・・・」と書いてあったのですが、私の使っている環境が「rewriteモジュールを使えない環境」である可能性はありますでしょうか?ありますでしょうか、と聞かれてもあれでしょうけど(笑)本には「rewriteモジュールを使えない環境」というのが具体的にどういう状況なのかは書かれていませんでした。その本には「xamppをインストールした時点ではrewriteモジュールは使えない」ということも書いてありました。「使えない環境」というのがhttpd.confファイルのrewriteモジュールの部分がコメントしてあるから使えない、ということなら、コメントは外したのでそれで解決だと思うのですが、それ以外の私の知らない要因でrewriteモジュールが使えない状況だとすると、その要因について調べてrewriteモジュールを使えるようにする必要がありますよね?実際そうなのかどうかわかりませんが(-_-;)

    キャンセル

  • 2015/10/15 02:50 編集

    "<IfModule mod_rewrite.c>"と"</IfModule>"の2行を削除して、Apacheを再起動してみてください。

    もしmod_rewriteモジュールが有効になっていなければ、起動できなくなるか、何かしらのエラーが表示されるはずです。
    http://httpd.apache.org/docs/2.2/mod/core.html#ifmodule

    mod_rewriteモジュールが無効になっていて、Apacheのバージョンが2.1以上の場合、"<IfModule mod_rewrite.c>"を"<IfModule rewrite_module>"に変更してみてください。

    http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html

    mod_rewriteモジュールが有効だった場合(正常にApacheが起動してしまった場合)、以下のリンクが参考になるかもしれません。
    http://d.hatena.ne.jp/pcmaster/20090207/p3
    http://d.hatena.ne.jp/pcmaster/20090607/p1

    キャンセル

0

※notable様の回答にコメントさせていただいた内容と同じです。
  内容的に回答欄に記載したほうがふさわしいかと思い直したため、こちらにも記載させていただきます。

"<IfModule mod_rewrite.c>"と"</IfModule>"の2行を削除して、Apacheを再起動してみてください。

もしmod_rewriteモジュールが有効になっていなければ、起動できなくなるか、何かしらのエラーが表示されるはずです。
http://httpd.apache.org/docs/2.2/mod/core.html#ifmodule

mod_rewriteモジュールが無効になっていて、Apacheのバージョンが2.1以上の場合、"<IfModule mod_rewrite.c>"を"<IfModule rewrite_module>"に変更してみてください。
http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html

mod_rewriteモジュールが有効だった場合(正常にApacheが起動してしまった場合)、以下のリンクが参考になるかもしれません。
http://d.hatena.ne.jp/pcmaster/20090207/p3
http://d.hatena.ne.jp/pcmaster/20090607/p1

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

rewriteモジュールが使えない環境、というのとはちょっと違いますが、.htaccessの内容が有効にならないパターンはあります。
.htaccessファイルでのアクセス制御を有効にするか無効にするかという設定がhttpd.conf内にあります。
もし、httpd.conf内に
AllowOverride None
という表記があった場合、
AllowOverride All
に編集すると解決する可能性があります。
参考:http://itpro.nikkeibp.co.jp/article/COLUMN/20080512/301299/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる