MVCを扱う上での備忘録

フレームワーク無しでPHPでウェブアプリを書いているけれど、どうしても忘れてしまって、

HTTP 500エラーが出てあたふたすることが多いんだよね。

なので、MVCの基本中の基本を備忘録として書き記しておきます。

フレームワークを使っている人でも参考になると思います。

目次

そもそもMVCって何?

MVCとは Model View Controller の略称で、

  • Model = DB関連
  • View = 画面表示
  • Controller = 各種処理

に役割を分けて、管理する形態のことです。

MVCを使わない形態よりも、どこで不具合が発生しているのかがわかりやすくなっています。

次はMVC形態のファイルを作っていきましょう!

入口のPHPファイル(public内)を作る

URLの元となるpublic直下にPHPファイルを作ります。

これはMVCでなくてもやっていると思いますが、中身はHTMLを全然書かず、PHPのみです。

PHP
<?php
require __DIR__ . '/../app/Controllers/TestController.php';

$controller = new TestController();
$controller->test();
?>

1行目の require [ControllerのPHPファイルのディレクトリ] でControllerのPHPファイルを読み込みます。

3行目の $[変数名] = new [コントローラー名](); でコントローラーのインスタンスを生成し、

4行目の $[変数名]->[関数名](); でController内に記載されている関数を呼び出します。

変数名は適当なものでOKですが、 コントローラー名、関数名は必ずControllerに記載されているものでないとダメです!

あと、1行目でrequireした時のディレクトリが合っているかどうかも十分注意してくださいね!

また、入口は1つでも場合によって呼び出す関数を分けたい時もありますよね。

そんな時、例えばform action=〇〇 で渡ってきたGETパラメータで分けたい場合は下記のように書きます。

PHP
<?php
require __DIR__ . '/../app/Controllers/TestController.php';

$controller = new TestController();

$action = $_GET['action'] ?? 'test';

switch ($action) {
    case 'jikken':
        $controller->jikkenshitsu();
        break;
    case 'mouse':
        $controller->mouse();
        break;
    case 'kenkyu':
        $controller->kenkyushitsu();
        break;
    default:
        $controller->test();
}

上記の例ではGETパラメータが多いのでswitch文にしていますが、少なければif文にして差し支えありません。

Controllerを作る

次は入口に書いたControllerにするPHPファイルを作ります。

PHP
<?php

class TestController {

  public function __construct()
  {
    ...
  }

  public function test() {
  
    ...
  
    require __DIR__ . '/../Views/test.php';
  }
}

?>

__construct()関数は先ほど作った入口用のPHPファイル内でコントローラーのインスタンスを生成した時点で呼び出されます。

session_start 等、先にやっておきたい処理がある場合はここに書きましょう。

その後、先ほど入口用PHPファイル内で呼び出した関数の処理が行われます。

Controllerは通常の処理をするだけでなく、Modelの作成やViewの呼び出しの指示等

まさにWEBサイトの処理に関する司令塔の役割を行います。

最後にViewを呼び出し、画面表示を行います。

View を作る

画面表示の胆となるViewを作ります。

Model を使わず、View を単純に表示したい場合は下記のようにHTMLやCSSを使用します。

ただ、HTMLやCSSを使うと言っても、拡張子は.phpで作ってくださいね!

HTML
<h2>テストページへようこそ!</h2>
<div>...<div>

もし、ヘッダーやフッターを別のPHPファイルとして作っているなら、下記のように書いて読み込めばOKです。

HTML
<?php
require __DIR__ . '/layouts/header.php';
?>

<h2>テストページへようこそ!</h2>
<div>...<div>

<?php
require __DIR__ . '/layouts/footer.php';
?>

また、$_SESSIONからセッションを呼び出して変数に入れ、それをHTMLの途中で変数を表示することもできます。

Model を作る

View を表示する上では必須ではありませんが、DB を使うなら ModelTestModel

まず、入口にModel のPHPファイルのディレクトリを書きます。

PHP
require __DIR__ . '/../app/Controllers/TestController.php';
require __DIR__ . '/../app/Models/TestModel.php';

次に、Controller で Model のインスタンスを生成します。

PHP
class TestController {

  private $pdo;

  public function __construct()
  {
    $this->pdo = require __DIR__ . '/../../public/db.php';
  }
  
  public function test() {
  
    $model = new TestModel($this->pdo);
    
    $rows = $model->getTable();
  
    require __DIR__ . '/../Views/test.php';
  }
}

__construct関数に書いてあるのはデータベース接続のために必要な情報のPHPファイルのディレクトリです。

例えば下記のような感じで作成しておきます。

PHP
<?php
$host = 'localhost:(ポート番号)'; //外部サーバーの場合はドメインやIPアドレス
$db   = '(データベース名)';
$user = '(MySQLのユーザー名)';
$pass = '(MySQLのパスワード)';
$dsn  = "mysql:host=$host;dbname=$db;charset=utf8mb4";

try {
    return $pdo = new PDO($dsn, $user, $pass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
} catch (Exception $e) {
    echo 'DB接続エラー: ', $e->getMessage();
    exit;
}

(returnは無くても動くかも)

最後に、Model 用のPHPファイルを作ります。

PHP
class TestModel
{
  private PDO $pdo;


  public function __construct($pdo)
  {
      $this->pdo = $pdo;
  }
  
  public function getTable(){
    ...
    return ...
  }
}

詳しいDB操作については下記の記事を参照してください。

今回のまとめ

①入口用のPHPファイルに Controller の関数を書く
②Controller に関数を書き、その中に必要な処理を書いて最後に View を表示する
③View も他のファイルと同じくPHPファイルで作り、HTMLやCSSで作る
④DB 操作も行うなら、Model 用のPHPファイルを作る

MVC を扱う上で基本中の基本を書き記してきましたが、如何だったでしょうか?

少しでも参考になれば嬉しいです!

  • URLをコピーしました!
目次