404 Not Found


希望 ログインページlogin.html.twigを表示させたい  
エラー 404 Not Found var_dumpなどをして、NULL NULL 404 Not Found404 Not Foundが出ます。  
ビギナーレベルです

NULL NULL 404 Not Found404 Not Foundを解消してログインページを正しく表示させたい

### 前提

anyaddressという下記のようなポートフォリオを作成しています。

ゴール  
anyaddress 完成 anyaddress＝ユーザーが登録して、ログインすると住居が見れる  
住居はユーザーが投稿したもののリスト 住居を見て詳細を閲覧できる 詳細から予約ができる 予約するとユーザーが予約したリストが見れる  
ログインしていれば投稿できるアプリケーション

【画面とその遷】関係するページのみ

ログインページ

ユーザー名とパスワードの入力フィールド  
[ログイン]ボタン 一覧ページへ遷移  
[新規登録]リンク 新規登録ページへ遷移

【各ディレクトリ、ファイルの内容】 関係するファイルのみ

Bootstrap.class.php: オートローダーやその他の設定を含む設定ファイル  
PDODatabase.class.php: データベース関連の処理を行うクラスファイル

Modelディレクトリ  
User.class.php: ユーザーモデルを表すクラスファイル  
Session.class.php セッション関係のクラスファイル

Controllerディレクトリ  
UserController.php: ユーザー関連の処理を行うコントローラーファイル

Viewディレクトリ  
login.html.twig: ログインページの表示を行うビューファイル  
register.html.twig: 新規登録ページの表示を行うビューファイル

publicディレクトリ  
ルーテイングの設定をindex.php

DB情報になります

テーブル

[code]

    +-------------------------+
    | Tables_in_anyaddress_db |
    +-------------------------+
    | books                   |
    | homes                   |
    | users                   |
    | sessions                |
    +-------------------------+
    4 rows in set (0.001 sec)
    
[/code]

カラム データ型、制約、主キーなど

[code]

    MariaDB [anyaddress_db]> DESCRIBE books;
    +---------+----------+------+-----+---------+----------------+
    | Field   | Type     | Null | Key | Default | Extra          |
    +---------+----------+------+-----+---------+----------------+
    | id      | int(11)  | NO   | PRI | NULL    | auto_increment |
    | user_id | int(11)  | YES  | MUL | NULL    |                |
    | home_id | int(11)  | YES  | MUL | NULL    |                |
    | date    | datetime | YES  |     | NULL    |                |
    | guests  | int(11)  | YES  |     | NULL    |                |
    +---------+----------+------+-----+---------+----------------+
    5 rows in set (0.022 sec)
    
    MariaDB [anyaddress_db]> DESCRIBE homes;
    +---------+---------------+------+-----+---------+----------------+
    | Field   | Type          | Null | Key | Default | Extra          |
    +---------+---------------+------+-----+---------+----------------+
    | id      | int(11)       | NO   | PRI | NULL    | auto_increment |
    | address | varchar(255)  | NO   |     | NULL    |                |
    | image   | blob          | YES  |     | NULL    |                |
    | title   | varchar(255)  | YES  |     | NULL    |                |
    | price   | decimal(10,2) | YES  |     | NULL    |                |
    +---------+---------------+------+-----+---------+----------------+
    5 rows in set (0.031 sec)
    
    MariaDB [anyaddress_db]> DESCRIBE users;
    +----------+--------------+------+-----+---------+----------------+
    | Field    | Type         | Null | Key | Default | Extra          |
    +----------+--------------+------+-----+---------+----------------+
    | id       | int(11)      | NO   | PRI | NULL    | auto_increment |
    | username | varchar(255) | NO   |     | NULL    |                |
    | password | varchar(255) | NO   |     | NULL    |                |
    | email    | varchar(255) | NO   |     | NULL    |                |
    +----------+--------------+------+-----+---------+----------------+
    4 rows in set (0.026 sec)
    
    MariaDB [anyaddress_db]> DESCRIBE sessions;
    +-------------+--------------+------+-----+---------+----------------+
    | Field       | Type         | Null | Key | Default | Extra          |
    +-------------+--------------+------+-----+---------+----------------+
    | id          | int(11)      | NO   | PRI | NULL    | auto_increment |
    | session_key | varchar(255) | NO   |     | NULL    |                |
    | user_id     | int(11)      | YES  | MUL | NULL    |                |
    | home_id     | int(11)      | YES  | MUL | NULL    |                |
    | date        | datetime     | YES  |     | NULL    |                |
    | guests      | int(11)      | YES  |     | NULL    |                |
    +-------------+--------------+------+-----+---------+----------------+
    6 rows in set (0.014 sec)
    
[/code]

下記は関係するであろうコードになります。

[code]

    <?php
    /*
      * ファイルパス : C:\xampp\htdocs\anyaddress\Bootstrap.class.php
      * ファイル名 : Bootstrap.class.php(設定に関するプログラム)
      */
    namespace anyaddress;
    date_default_timezone_set('Asia/Tokyo');
    require_once dirname(__FILE__) . '/vendor/autoload.php';
    
    class Bootstrap
    {
        const DB_HOST = 'localhost';
        const DB_NAME = 'anyaddress_db';
        const DB_USER = 'anyaddress_user';
        const DB_PASS = 'anyaddress_pass';
        const DB_TYPE = 'mysql';
        const APP_DIR = 'c:/xampp/htdocs/anyaddress/';
        const TEMPLATE_DIR = self::APP_DIR . 'View/';
        const CACHE_DIR = false; 
        const APP_URL = 'http://localhost/anyaddress/'; // プロジェクトのURL
        const ENTRY_URL = self::APP_URL;
    
        public static function loadClass($class)
        {
            $path = str_replace('\\', '/', self::APP_DIR . $class . '.class.php');
        require_once $path;
        }
    }
    
    spl_autoload_register([
        'anyaddress\Bootstrap',
        'loadClass'
    ]);
    
[/code]

[code]

    <?php
    /*
      * ファイルパス : C:\xampp\htdocs\anyaddress\public\index.php
      * ファイル名 : index.php(ルーテイング設定に関するプログラム)
      */
      error_reporting(E_ALL);
      ini_set('display_errors', 1);
    
      require_once __DIR__ . '/../Bootstrap.class.php';
      use anyaddress\Bootstrap;
      use anyaddress\Controller\HomeController;
      use anyaddress\Controller\BookController;
      use anyaddress\Controller\UserController;
      
      // リクエストURIの取得
      $uri = $_SERVER['REQUEST_URI'];
      
      // ルーティング設定
      $routes = [
          '/View/login' => [UserController::class, 'login'],
          '/View/register' => [UserController::class, 'register'],
          '/View/homelist(\d+)' => [HomeController::class, 'homelist'],
          '/View/detail' => [HomeController::class, 'detail'],
          '/view/book' => [BookController::class, 'book'],
          '/View/complete' => [BookController::class, 'complete'],
          '/view/booklist(\d+)' => [BookController::class, 'booklist'],
          '/View/post' => [HomeController::class, 'post']
      ];
      
      // ルーティングに応じたコントローラーとアクションの取得
      $controller = null;
      $action = null;
      foreach ($routes as $route => $handler) {
          if (strpos($uri, $route) === 0) {
              $controller = new $handler[0]();
              $action = $handler[1];
              break;
          }
      }
      
      // コントローラーとアクションの確認
    var_dump($controller, $action);
    
    // コントローラーとアクションの実行
    try {
        if ($controller !== null && $action !== null) {
            $controller->$action();
        } else {
            echo '404 Not Found';
        }
    } catch (Exception $e) {
        // エラーメッセージを表示するか、エラーログを記録するなどの処理
        echo 'エラーが発生しました: ' . $e->getMessage();
    }
    
      // コントローラーとアクションの実行
      try {
          if ($controller !== null && $action !== null) {
              $controller->$action();
          } else {
              echo '404 Not Found';
          }
        } catch (Exception $e) {
          // エラーメッセージを表示するか、エラーログを記録するなどの処理
          echo 'エラーが発生しました: ' . $e->getMessage();
      }
    
    ?>
    
[/code]

[code]

    <?php
    /*
     * ファイルパス :C:\xampp\htdocs\anyaddress\Model\User.class.php
     * ファイル名 :User.class.php(ユーザーに関するプログラムのクラスファイル、Model)
     */
    namespace anyaddress\Model;
    
    class User
    {
        private $db;
        private $session;
    
        public function __construct($db, $session)
        {
            $this->db = $db;
            $this->session = $session;
        }
    
        public function login($username, $password)
        {
            if (empty($username)|| empty($password)) {
                return false;
            }
    
            $table = 'users';
            $column = 'id, username, password';
            $where = 'username = ?';
            $arrVal = [$username];
    
            $userData = $this->db->select($table, $column, $where, $arrVal);
    
            // ユーザー名に対応するユーザー情報が存在しない場合はログイン失敗
            if(empty($userData)) {
                return false;
            }
    
            // パスワードのハッシュをデータベースから取得したユーザー情報と比較
            if(password_verify($passowrd, $userData[0]['passoword'])) {
                // ログイン成功時にSessionクラスのcheckSessionメソッドを呼び出す
                $this->session->checkSession();
                $_SESSION['user_id'] = $userData[0]['id'];
                return $userData[0]['id'];
            } else {
                return false;
            }
            
            var_dump($controller, $action);
    
        }
    
        public function isLoggedIn()
        {
            return isset($_SESSION['user_id']);
    
        }
    
    
        public function logout()
        {
            // セッションを破棄してログアウトする
            session_destroy();
        }
    
        
    
        public function register($username, $password)
        {
            // パスワードのハッシュ化
            $hashedPassword = password_hash($password, PASSWORD_DEFAULT);
    
            // ユーザー情報を登録する
            $table = 'users';
            $insData = [
                'username' => $username,
                'password' => $hashedPassword
                
            ];
            return $this->db->insert($table, $insData);
        }
    
        public function getUser($userId)
        {
            // ユーザーIDに基づいて、指定されたユーザーの情報を取得するロジックを実装
            $table = 'users';
            $column = 'id, username, email';
            $where = 'id = ?';
            $arrVal = [$userId];
            
            // 取得したユーザー情報を返す
            $userData = $this->db->select($table, $column, $where, $arrVal);
            return $userData[0]??null;
        }    
    }
    
[/code]

[code]

    <?php
     /*
      * 　ファイルパス : C:\xampp\htdocs\anyaddress/Controller/UserController.php
      * ファイル名 : UserController.php(ユーザー関連の処理を制御するコントローラー)
      * アクセスURL http://localhost/anyaddress/Controller/UserController.php
      */
    namespace anyaddress\Controller;
      
    require_once dirname(__FILE__) . '/../Bootstrap.class.php';
      use anyaddress\Bootstrap;
      use anyaddress\PDODatabase;
      use anyaddress\Model\Session;
      use anyaddress\Model\User;
    
      $db = new PDODatabase(Bootstrap::DB_HOST, Bootstrap::DB_USER, Bootstrap::DB_PASS, Bootstrap::DB_NAME, Bootstrap::DB_TYPE);
      $ses = new Session($db);
      $user = new User($db, $ses); // SessionクラスをUserクラスにインジェクション
    
      $loader = new \Twig_Loader_Filesystem(Bootstrap::TEMPLATE_DIR);
      $twig = new \Twig_Environment($loader, ['cache' => Bootstrap::CACHE_DIR]);
    
      // セッションに、セッションIDを設定する
      $ses->checksSession();
    
      //ログインページ
      if ($_SERVER['REQUEST_METHOD'] === 'GET' && !isset($_SESSION['user_id'])) {
        // ログインしていない場合の処理
        $template = $twig->loadTemplate('login.html.twig');
        $template->display();
        exit;
      } 
    
    // ログインページからのPOSTリクエスト
    if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['login'])) {
      $username = $_POST['username'];
      $password = $_POST['password'];
    
      if ($user->login($username, $password)) {
          // ログイン成功した場合の処理
          header('Location: ' . Bootstrap::ENTRY_URL . 'homelist.html.twig');
          exit();
      } else {
          // ログイン失敗した場合の処理
          $loginError = true;
      }
    }
    
    // 新規登録ページ
    if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_SESSION['user_id'])) {
      // ログインしている場合の処理
      $template = $twig->loadTemplate('login.html.twig');
      $template->display();
      exit;
    } else {
      // ログインしていない場合は新規登録ページを表示する
      $template = $twig->loadTemplate('register.html.twig');
      $template->display();
      exit;
    }
    
    
    // 新規登録ページからのPOSTリクエスト
    if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['register'])) {
      $username = $_POST['username'];
      $password = $_POST['password'];
    
      if ($user->register($username, $password)) {
        // 登録成功した場合の処理
        $registrationSuccess = true;
    } else {
        // 登録失敗した場合の処理
        $registrationError = true;
    }
    }
    
    // Twigテンプレートにデータを渡して表示
    $template = $twig->loadTemplate('login.html.twig');
    $template->display([
    'loginError' => $loginError ?? false,
    ]);
    $template = $twig->loadTemplate('register.html.twig');
    $template->display([
      'registrationSuccess' => $registrationSuccess ?? false,
      'registrationError' => $registrationError ?? false
    ]);
    
[/code]

login.html.twig

[code]

    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="content-type" content="text/html; charset=utf-8" />
            <link href="{{constant('anyaddress\\Bootstrap::APP_URL')}}css/some-css.css" rel="stylesheet" type="text/css" />
        </head>
        <body>
        <div id="wrapper">
            <h2>ログイン</<>h2>
            <form method="POST" action="{{constant('anyaddress\\Bootstrap::APP_URL')}}Controller/UserController.php">
                <div>
                   <label for="username">ユーザー名:</label>
                   <input type="text" name="username" id="username" required>
                </div>
                <div>
                    <label for="password">パスワード:</label>
                    <input type="password" name="password" id="password" required>
                </div>
                <div>
                    <input type="submit" name="login" value="ログイン">
                </div>
            </form>
            <p><a href="{{ constant('anyaddress\\Bootstrap::APP_URL') }}View/homelist.html.twig">一覧ページ</a></p>
            <p><a href="{{ constant('anyaddress\\Bootstrap::APP_URL') }}View/register.html.twig">新規登録</a></p>
    　　</div>
        </body>
    </html>
    
[/code]

Apache error.log

[code]

    [Wed Oct 04 16:46:37.292864 2023] [ssl:warn] [pid 4132:tid 352] AH01909: www.example.com:443:0 server certificate does NOT include an ID which matches the server name
    [Wed Oct 04 16:46:37.379849 2023] [ssl:warn] [pid 4132:tid 352] AH01909: www.example.com:443:0 server certificate does NOT include an ID which matches the server name
    [Wed Oct 04 16:46:37.471197 2023] [mpm_winnt:notice] [pid 4132:tid 352] AH00354: Child: Starting 150 worker threads.
    
[/code]

### 試したこと

DocumentRootが正しいか調べた

index.phpのBootstrap.class.phpのパスが正しいか調べた  
index.phpのルーテイング設定に/View/ というパスを追加した

↓

アクセスURL `http://localhost/anyaddress/View/login` のログインページを表示させようとしたところ、NULL
NULL 404 Not Found404 Not Foundというエラーが出ております。  
404 not found という出力はindex.phpの61行目 echo '404 Not Found'; の処理によるものです。

何卒よろしくお願いします。

