MVCフレームワークを作って理解が深まった!!

追加
Dive Into Codeでカリキュラムで使用するテキストの無料公開されてるみたいですね
RailsしたかったりHTMLやCSSなどを改めて勉強したりスクール興味ない人でも見ておいて良いかもしれませんね!→URL

愛読ってほどではないですが常にブラウザで開いてるページがあります
phpTheRightWay
php.net
TechscoreSQL

どれもおすすめというか初心者向けでは全くないですが必要な知識だと思います!

今回は一番上のPHP The RightwayでMVCフレームワークの簡単なファイルがあって
それを実際に作ってみてこれがわかりやすすぎ!と思ったのでRailsとかフレームワークをいきなり始める人向けに魔法を解いてあげようと思います!!

MVCフレームワークとは
データベース部分やビュー部分を分割して便利にしようというもの
MVCはモデル、ビュー、コントローラーの頭文字を繋げただけ

サンプルを見た方が早いので見てみましょう!!(PHPやってなくてもわかるはず)
PHP The RightWay のチャプター8

一つのファイルにデータベース接続とSELECTによってデータを抽出
それをforeachでデータがあるだけ表示させるプログラム

<?php
$pdo = new PDO('sqlite:/path/db/users.db');
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
?>
//ここまででデータベースに接続してデータを抽出、以下はHTMLにPHPを埋め込みデータを表示
<html>
<ul>
<?php
 foreach ($db->query('SELECT * FROM table') as $row) {
 echo "<li>".$row['field1']." - ".$row['field1']."</li>";
}
?>
</ul>
</html>


これは本当にただデータベースに接続してそれを表示だけで済んでいるが簡単な一言掲示板だとかなりの量のファイルになってしまう更に機能を追加するとなると行数がとんでもなくなってしまって大変だ
ということで分割
本当はデータベース接続も別ファイルにした方が良いがサンプルそのまま使う

ディレクトリ構成はこんな感じ
myappディレクトリに
・foo.php (コントローラー部分に当たる)
・models/FooModel.php (モデルに当たるファイルの名前はモデルはこうやって書くみたいに気にしないで)
・views/foo-list.php (ビューに当たる)

・foo.phpの中身はこんな感じ
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8mb4', 'username', 'password');

// モデルを読み込む
include 'models/FooModel.php';

// インスタンスを作る
$fooModel = new FooModel($db);
// Fooのリストを作る
$fooList = $fooModel->getAllFoos();

// ビューを表示する
include 'views/foo-list.php';

includeでmodels/FooModel.php と views/foo-list.php を読み込んでいる
分割したものを読み込んでいるだけなのだ!!


・models/FooModels.phpはサンプルだとちょっと変わっている(クラスにして SELECTをメソッドにして使いやすくしている)
<?php
class FooModel
{
 protected $db;

 public function __construct(PDO $db)
 {
  $this->db = $db;
 }

 public function getAllFoos() {
  return $this->db->query('SELECT * FROM table');
 }
}

実際はさっきのこれと同じと考えて良い
<?php
$pdo = new PDO('sqlite:/path/db/users.db');
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
?>
単にデータベースのデータを取ってくるだけ


・views/foo-list.php は残りのHTMLとしてデータの表示で当然こうなる
<html>
<ul>
 <?php foreach ($fooList as $row): ?>
  <li><?php echo$row['field1'] ?> - <?php echo$row['field1'] ?></li>
 <?php endforeach ?>
</ul>
</html>

単に分割してるだけなのだ
dbconnectなどデータベース接続用のファイルを作る感覚で分割して一つのファイル(今回はコントローラーfoo.php)で読み込む
HTML部分が見やすくなってる+データベースが変わる、入力など操作が変わればデータベースのところを変更しよう
これで立派なMVCフレームワークになった

正直フレームワークは柔軟性がないとかPHPに強いエンジニアが言ってるのを聞いてて
いやキツイでしょって思ってたけど私は全然問題ない感じがしてきた


・プラスアルファ
ちなみに htmlspecialchars と書いてエスケープ処理することが必須だったりする
alertなどのいたずら、悪用を防ぐ為に必須なわけだけど
複数の項目 例えば タイトル、本文、コメントなどを多くのページで書くのは指が疲れてしまうしダサい。なので関数にして楽をしよう!!
function h($value) {
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
単純にこんな感じで使える
<?php print h("変数など") ?>
hの1文字で省略して書けるようになる
同様にデータベースの処理も簡単にする為にクラスにしたのが先ほどのMVCのサンプルにもなっている
(getAllFoosの関数で簡単にSELECT文を使えるようにしている)

そんなこんなで色々省略していけばフレームワークの思想、使い方がわかり
流行の移り変わりにも対応できるようなものが使えるはず

ちなみにRubyから始めてPHPをやっているわけですが挫折さえしないならWebならPHPの方が理解ができると思うのでPHPを勧めます

コメント

人気の投稿