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

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

ただいまの
回答率

89.96%

パーフェクトPHPの8章のミニブログのエラー解決について

解決済

回答 7

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,425

NaojirouHisada

score 58

現在 パーフェクトPHPを通して、 PHPを学んでいます。

そこで、 7章で、フレームワークの土台を作成しました。 miniblogというディレクトリの配下に、 core , web , models , controllers , viewsというディレクトリがあります。

8章では実際にミニブログの実装を行うのですが、 その際に、miniblogディレクトリ配下に、MiniBlogApplication.phpファイルを作成し、そのファイルに、coreのApplication.phpファイルの内容をextendsさせるというのがありました。 MiniBlogApplication.phpのソースコードはこれです。

<?php


class MiniBlogApplication extends Application
{
    protected $login_action = array('account' , 'signin');

    public function getRootDir()
    {
        return dirname(__FILE__);
    }

    protected function registerRoutes()
    {
        return array(
        );
    }

    protected function configure()
    {
        $this->db_manager->connect( 'master' , array(
            'dsn'        => 'mysql:dbname=mini_blog;host=localhost',
            'user'        => 'root',
            'password'    => '',
        ) );
    }
}

そのMiniBlogApplication.phpファイルを、webディレクトリ配下のindex.phpでrequireして使用するということでrequireしてみた結果、

Fatal error: Class 'Application' not found in /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/MiniBlogApplication.php on line 5

このようなエラーが発生しました。

そのため、 パーフェクトPHPのサンプルコード確認して、デバックし、再度index.phpを開いてみましたが、このエラーが消えません。

どなたか解決方法を教えていただけないでしょうか? よろしくお願いします。

ちなみに、 miniblog/Core/Application.phpのソースコードはこれです。

<?php

abstract class Application
{
    protected $debug = false;
    protected $request;
    protected $response;
    protected $session;
    protected $db_manager;
    protected $login_action = array();

    public function __construct($debug = false )
    {
        $this->setDebugMode($debug);
        $this->initialize();
        $this->configure();
    }

    protected function setDebugMode($debug)
    {
        if ( $debug){
            $this->debug = true;
            ini_set('display_errors' , 1 );
            error_reporting(-1);
        } else {
            $this->debug = false;
            ini_set( 'display_errors' , 0 );
        }
    }

    protected function initialize()
    {
        $this->request = new Request();
        $this->response = new Response();
        $this->session = new Session();
        $this->db_manager = new DbManager();
        $this->router = new Router ( $this->registerRoutes() );
    }

    protected function configure()
    {
    }

    abstract public function getRootDir();

    abstract protected function registerRoutes();

    public function isDebugMode()
    {
        return $this->debug;
    }

    public function getRequest()
    {
        return $this->request;
    }

    public function gerResponse()
    {
        return $this->response;
    }

    public function getSession()
    {
        return $this->session;
    }

    public function getDbManager()
    {
        return $this->db_manager;
    }

    public function getControllerDir()
    {
        return $this->getRootDir() . '/controllers';
    }

    public function getViewDir()
    {
        return $this->getRootDir() . '/views';
    }

    public function getModelDir()
    {
        return $this->getRootDir() . '/models';
    }

    public function getWebDir()
    {
        return $this->getRootDir() . '/web';
    }

    public function run()
    {


        try{
            $params = $this->router->resolve($this->request->getPathInfo() );
            if ( $params === false){
                throw new HttpNotFoundException( 'No route found for ' . $this->request->getPathInfo() );
            }

            $controller = $params['controller'];
            $action = $params['action'];

            $this->runAction($controller,$action,$params);


        }catch (HttpNotFoundException $e){
            $this->render404Page($e);
        } catch (UnauthorizedActionException $e){
            list($controller , $action) = $this->login_action;
            $this->runAction($controller, $action);
        }

        $this->response->send();
    }


    public function runAction($controller_name , $action , $params = array() )
    {
        $controller_class = ucfirst($controller_name) . 'Controller';

        $controller = $this->findController($controller_class);
        if ($controller === false){
            throw new HttpNotFoundException( $controller_class . ' controller is not found . ' );
        }

        $content = $controller->run($action , $params);

        $this->response->setContent($content);
    }

    protected function findController($controller_class)
    {
        if ( !class_exists($controller_class) ){
            $controller_file = $this->getControllerDir() . '/' . $controller_class . '.php';

            if ( !is_readable($controller_file) ){
                return false;
            } else {
                require_once $controller_file;

                if ( !class_exists($controller_class) ){
                    return false;
                }
            }
        }

        return new $controller_class($this);
    }

    protected function render404Page($e)
    {
        $this->response->setStatusCode(404 , 'Not Found');
        $message = $this->isDebugMode() ? $e->getMessage() : 'Page not found.';
        $message = htmlspecialchars($message , ENT_QUOTES, 'UTF-8');

        $this->response->setContent( <<<EOF
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>404</title>
</head>
<body>
    {$message}
</body>
</html>
EOF
        );
    }

}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • afroscript

    2015/12/15 16:27 編集

    (質問の内容に直接関係ないので、恐縮ですが、)ソースコード部分を```で囲むとシンタックスハイライトになって見やすくなりますのでぜひ…!!
    ```
    ソースコード
    ```
    って感じです!

    キャンセル

回答 7

checkベストアンサー

+1

/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/core/ClassLoader.php のソースを見せていただけますか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/12/17 16:18

    まずは当初出ていたエラーが解決できたので、この回答をベストアンサーに選ぶ等されたほうがhyper-drums-koさんに失礼がないかと。。

    アプリ側で他にTypoなどでエラーがなければ、DBの設定を適切に行えば解決できると思います。
    新しいエラーだとMySQLのDBに接続できないようですがmini_blogというデータベースは作成されましたか?作成していなければcreate database mini_blog;としてからMiniBlogApplication.phpの下の方にある接続情報とMySQLの権限を合わせれば動くはずです。mysql grantとかflush privilegesとかでググると出てくると思います。
    もしかしたらphpmyadminでやったほうが楽かもしれないですね。

    キャンセル

  • 2015/12/17 18:01

    すみません(^^;)
    今後気をつけます(^^;;)

    アドバイスありがとうございます。
    やってみます!!

    キャンセル

  • 2015/12/17 18:06

    mini_blogのデータベースは作成しました(^^)

    キャンセル

+1

Fatal error: Class 'Application' not found

なので Application.php が見つからないようですね。

webディレクトリ配下のindex.phpでrequireして使用するということでrequireしてみた結果

上記の index.php も提示いただけますか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/12/13 18:16

    アドバイスありがとうございます!!
    これが、
    index.phpのソースコードです!!
    <?php

    require '../bootstrap.php';
    require '../MiniBlogApplication.php';

    $app = new MiniBlogApplication(true);
    $app->run();

    キャンセル

  • 2015/12/13 20:32

    hyper-drums-koさん、回答を拝見しました。「index.php で適切に require されていれば動作する」ということは、このbootstrap.phpのrequireとMiniBlogApplication.phpのrequireの間でapplication.phpをrequireする必要があるということでしょうか?

    キャンセル

  • 2015/12/14 11:18

    > このbootstrap.phpのrequireとMiniBlogApplication.phpのrequireの間でapplication.phpをrequireする必要があるということでしょうか?

    下記でも回答しましたが、bootstrap.php でフレームワークのクラスをロードしているので require する必要はないようですね。

    キャンセル

+1

アクセス時は MiniBlogApplication.php が直接呼ばれているわけではなく、webroot 配下の index.php が呼ばれてそこから Dispatch されているかと思いますので、index.php で適切に require されていれば動作するのではないかと思われます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/12/13 18:18

    アドバイスありがとうございます!!

    indexの方でapplication.phpをrequireするということでしょうか??

    キャンセル

  • 2015/12/14 11:16

    サンプルコードをダウンロードしてみました。

    bootstrap.php でフレームワークのクラスをロードしているので index.php では require する必要はないですね。

    以下の情報をいただけますか?
    ・Apache のドキュメントルート
    ・ブラウザからアクセスしたURL

    キャンセル

  • 2015/12/14 14:49

    これが、
    Apacheのドキュメントルートです。
    NameVirtualHost *:80

    <VirtualHost *:80>
    DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs"
    ServerName localhost
    </VirtualHost>

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

    <Directory "/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/web">
    AllowOverride All
    Allow from All
    </Directory>
    </VirtualHost>

    ブラウザからは、
    http://mini-blog.localhost
    です。

    キャンセル

0

MiniBlogApplication.phpではapplication.phpをrequireする必要はないんですか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/12/13 18:17

    MiniBlogApplication.php では、applicationクラスをextendsしてますが、
    書籍とサンプルコードでは、このようになっていましたけど、
    フレームワークを構築しているため必要なんだと思います(^^;)

    キャンセル

0

bootstrap.php でクラスが正しくロードされていないように思われます。

<?php

require 'core/ClassLoader.php';

$loader = new ClassLoader();
$loader->registerDir(dirname(__FILE__).'/core');
$loader->registerDir(dirname(__FILE__).'/models');
$loader->register();

となっており、bootstrap.php と同じ階層に「core」「models」ディレクトリが存在するでしょうか。

また、「core」ディレクトリ内に「Application.php」ファイルが存在しておりますでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/12/15 13:00

    ls -l /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost
    とターミナルに記述しましたら、このようにでました。

    -rw-r--r--@ 1 hisadanaojirou staff 3451 12 5 15:33 Application.php
    -rw-r--r--@ 1 hisadanaojirou staff 392 11 27 16:07 ClassLoader.php
    -rw-r--r--@ 1 hisadanaojirou staff 2968 12 6 10:48 Controller.php
    -rw-r--r--@ 1 hisadanaojirou staff 1731 12 6 10:59 DbManager.php
    -rw-r--r--@ 1 hisadanaojirou staff 592 11 30 15:03 DbRepository.php
    -rw-r--r--@ 1 hisadanaojirou staff 58 12 6 11:01 HttpNotFoundException.php
    -rw-r--r--@ 1 hisadanaojirou staff 1442 11 9 20:33 Request.php
    -rw-r--r--@ 1 hisadanaojirou staff 682 11 10 11:21 Response.php
    -rw-r--r--@ 1 hisadanaojirou staff 954 12 6 11:10 Router.php
    -rw-r--r--@ 1 hisadanaojirou staff 976 12 6 11:13 Session.php
    -rw-r--r--@ 1 hisadanaojirou staff 63 12 6 11:14 UnauthorizedActionException.php
    -rw-r--r--@ 1 hisadanaojirou staff 899 12 6 11:16 View.php
    hisadanaojirou-no-MacBook-Pro:~ hisadanaojirou$ ls -l /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost
    total 2600
    -rw-r--r--@ 1 hisadanaojirou staff 437 12 13 11:14 MiniBlogApplication.php
    -rw-r--r--@ 1 hisadanaojirou staff 190 11 28 13:51 bootstrap.php
    drwxr-xr-x 2 hisadanaojirou staff 68 11 8 10:08 controllers
    drwxr-xr-x 15 hisadanaojirou staff 510 12 6 11:16 core
    -rw-r--r--@ 1 hisadanaojirou staff 1317800 12 6 11:17 core 14.04.52
    drwxr-xr-x 2 hisadanaojirou staff 68 11 8 10:08 models
    drwxr-xr-x 2 hisadanaojirou staff 68 11 8 10:08 views
    drwxr-xr-x 6 hisadanaojirou staff 204 12 15 11:44 web
    -rw-r--r--@ 1 hisadanaojirou staff 129 11 28 13:53 名称未設定.txt

    キャンセル

  • 2015/12/16 16:53

    Application.phpの中身(最初の10行程度)はどうなっていますでしょうか?
    下記の行のクラス名は「Application」になっていますか?手元の環境で試したところ、ここを「Application2」等に変更すると同じエラーが出ました。

    abstract class Application

    coreフォルダのコピーを作成されているようなので、テスト中に変更してしまったというようなことはありませんか?

    キャンセル

  • 2015/12/16 18:20

    検索してみましたが、
    abstract class Applicationと記述していました(^^;)

    キャンセル

0

index.php を以下のように変更すると、何が表示されますか?

<?php

require '../bootstrap.php';
require '../MiniBlogApplication.php';

var_dump(get_included_files());

//$app = new MiniBlogApplication(true);
//$app->run();

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/12/15 15:01

    コメントアウトして行ってみましたが、
    やはり上記のエラーがでたままでした(^^;)

    キャンセル

  • 2015/12/15 18:30

    ごめんなさい。
    ---
    require '../MiniBlogApplication.php';
    ---
    の行もコメントアウトしてみてください。。。

    キャンセル

  • 2015/12/16 02:08

    返信が遅くなりまして、申し訳ございません(^^;)
    コメントアウトを行ってみた結果、
    このようにでました(^^)
    ```
    array(3) { [0]=> string(71) "/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/web/index.php" [1]=> string(71) "/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/bootstrap.php" [2]=> string(78) "/Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/core/ClassLoader.php" }
    ```

    キャンセル

0

もしかしてApplication.phpの58行目にあるgetResponse()メソッドがgerResponse()になってるのが原因じゃないですか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/12/16 18:19

    ご指摘ありがとうございます。
    今現在デバックを行い再度XAMPPを起動してみましたが、
    やはり、
    Fatal error: Class 'Application' not found in /Applications/XAMPP/xamppfiles/htdocs/mini-blog.localhost/MiniBlogApplication.php on line 5
    のエラーが発生したままでした(^^;)

    キャンセル

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

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

同じタグがついた質問を見る