前回でCakePHP3の動作環境を作成したので、動作確認もかねてCakeを触っている人なら1度は見たことあるであろう公式のブログチュートリアルを、CakePHP3向けに変更しつつ作成していきます。
ブログデータベースの作成
ここはチュートリアルと同様のテーブルを作成します。以下のSQLでpostsテーブルを作成し、テストデータも作成します。
[sql]
CREATE TABLE posts (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(50),
body TEXT,
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL
);
INSERT INTO posts (title,body,created)
VALUES (‘タイトル’, ‘これは、記事の本文です。’, NOW());
INSERT INTO posts (title,body,created)
VALUES (‘またタイトル’, ‘そこに本文が続きます。’, NOW());
INSERT INTO posts (title,body,created)
VALUES (‘タイトルの逆襲’, ‘こりゃ本当にわくわくする!うそ。’, NOW());
[/sql]
Cakeのデータベース設定
CakePHP3からは、データベース設定はApp/Config/app.phpに統合されました。このコードからDatasourcesの行を探し、自分の環境に合わせた設定にします。
[php]
‘Datasources’ => [
‘default’ => [
‘className’ => ‘Cake\Database\Driver\Mysql’,
‘persistent’ => false,
‘host’ => ‘localhost’, //Mysqlサーバホスト名またはIPアドレス
‘login’ => ‘root’, //Mysqlユーザ名
‘password’ => ”,
‘database’ => ‘blog’, //スキーマ
‘prefix’ => false,
‘encoding’ => ‘utf8’,
],
[/php]
この後Security.saltなどの変更が指示されていますが、composerでCakePHP環境を作成していればこの値はすでにランダム値で設定されています。便利な世の中になりました。
モデルの作成
CakePHP3からここが大きく変わりました。Modelはテーブルの定義と関連を記述するTableと、DBのレコードとなるEntityの2つに分割されました。CakePHP3では、DBからレコードを取得すると今までの配列に変わり、Entityで定義したクラスのオブジェクトになります。
Tableの作成
App/Model/Table/PostsTable.phpを新規作成します。
[php]
<?php
namespace AppModelTable;
use CakeORMTable;
class PostsTable extends Table {
}
?>
[/php]
DBのテーブル名がpostsであれば、特に記述は必要ありません。ここでは、実際のテーブル名へのマッピングや、hasManyなどの他テーブルへの関連を記載します。
Entityの作成
App/Model/Entity/post.php を作成します。クラス名は複数形から単数形に変わります。
[php]
<?php
namespace AppModelEntity;
use CakeORMEntity;
class Post extends Entity {
}
?>
[/php]
このクラスには、取得したデータの変換やバリデーションを記述します。今回は何もしないので空にしておきます。
Postsコントローラの作成
コントローラ自体はあまり変わっていません。App/Controller/PostsController.phpを新規作成します。まず、index()のみを作成します。
[php]
<?php
namespace AppController;
use AppControllerAppController;
use CakeORMTableRegistry;
class PostsController extends AppController {
public function index(){
$poststable = TableRegistry::get(‘Posts’);
$this->set(‘posts’, $poststable->find(‘all’));
}
}
?>
[/php]
モデルの使用方法は変更されました。TableRegistry::get() で先ほど作成したTableクラスのオブジェクトを取得し、そのオブジェクトでTableを操作します。
今回は、テーブルに登録されているデータ全てを取得するコードのみを記載します。
Postビューの作成
indexアクション用のビューを作成します。CakePHP3ではビューの保存先が変更され、App/Templete になりました。App/TempleteにPostsディレクトリを作成し、
App/Templete/Posts/index.ctpを新規作成します。
[php]
<h1>Blog posts</h1>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Created</th>
</tr>
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post->id; ?></td>
<td>
<?php echo $this->Html->link($post->title, array(‘controller’ => ‘posts’, ‘action’ => “view”, $post->id));?>
</td>
<td><?php echo $post->created->format(‘Y-m-d H:i:s’); ?></td>
</tr>
<?php endforeach; ?>
<?php unset($post); ?>
</table>
[/php]
Modelの扱いが変わっています。ここでは以下の2つが関連します。
・DBのレコードがオブジェクトとなった
配列からオブジェクトになり、DBのカラム名でプロパティが作成されます。$post[‘Post’][‘id’]で取得していた方式から$post->id に変わりました。
簡単になりました。
・データ型がStringからDBカラムに応じたデータ型になった
今まではModelで取得した結果はすべてStringでしたが、カラムに応じたデータ型になっています。$post->createdはDATETIME型でDBを作成しているのでプロパティもDatetTimeのオブジェクトとなっています。これで日付関連の処理も簡単になりそうな気がします。
実行
ひとまずDB内容を表示するページが作成できましたので、ここで動作確認しておきましょう。/posts をブラウザで開き、以下の画面が表示されればOKです。
リンク先のページを作成していないのでエラーとなりますが、今は気にしないことにします。
まとめ
DBからのデータ取得と表示部分のみを作成しました。興味がある方は別ページの作成と新規投稿処理なんかを作成していくと面白いかもしれません。