one's way blog

ワクワクを生み出せるWebエンジニアを目指して。

CakePHP 3.x | フレームワークを使ってブックマークアプリケーションを作る

f:id:seintoseiya:20160110211740j:plain

前回はcakephp2.xを使ってブログアプリを作りましたが、
今回は最新版の3.xを使ってブックマークアプリケーションを作成したいと思います。

環境

ローカル開発環境は以下のとおりです。

作るもの

公式チュートリアルに沿ってブックマークアプリケーションを作成していきます。
ブックマークチュートリアル - 3.10

ダウンロード・インストール

2.xではソースをダウンロードしてサーバーに配置するという手順を取っていましたが、
3.xではComposerを使う方法を推奨しています。このComposerとはパッケージ管理システムの一つで、
rubyやnode.jsなどモダンな開発言語・フレームワークで使われている手法です。
(インストール時に必要なパッケージをダウンロードしたり、設定してくれたりする便利なやつと思っていただければよろしいかと思います。)
せっかくなので、Composerを使ってローカル環境を構築してみました。

デフォルトPHPの変更

チュートリアルを進める前に、今回はMAMPを使用しているのでPHPMAMPのものに変更する必要があります。(これをしないとCakePHP3のインストール時にエラーになる可能性がある)
以下リンクを参考にPHPを変更。
MAMPとComposerを使ったCakePHP3.xのローカル開発環境の構築 - Qiita

Composerのインストール

私の環境ではcURLが元々インストールされていたので、チュートリアルの通り、以下をコマンドで実行してComposerをインストール。

curl -s https://getcomposer.org/installer | php

CakePHPをインストール

CakePHPをダウンロード・インストールして、bookmarkerという名前のアプリを作成しまします。

php composer.phar create-project --prefer-dist cakephp/app bookmarker

途中で「Set Folder Permissions ? (Default to Y) [Y,n]?」と聞かれますが、これはログを保存するフォルダに権限を与えるかという質問なので、Yesを選択。

CakePHPディレクトリ構造

ダウンロードしたCakePHPは以下のような構成になっています。

/bookmarker
    /bin
    /config
    /logs
    /plugins
    /src
    /tests
    /tmp
    /vendor
    /webroot
    .editorconfig
    .gitignore
    .htaccess
    .travis.yml
    composer.json
    index.php
    phpunit.xml.dist
    README.md

動作確認

http://localhost:… にアクセスしてcakephpのwelcomeページが表示されればインストールは正常に完了しています。
f:id:seintoseiya:20160122214149p:plain

開発手順

チュートリアルに沿って行うので、下記は細かい手順より内容の説明よりの文になります。

データベースの作成

ブックマークアプリで使うデータベースを作成します。

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(255) NOT NULL,
    password VARCHAR(255) NOT NULL,
    created DATETIME,
    modified DATETIME
);

CREATE TABLE bookmarks (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    title VARCHAR(50),
    description TEXT,
    url TEXT,
    created DATETIME,
    modified DATETIME,
    FOREIGN KEY user_key (user_id) REFERENCES users(id)
);

CREATE TABLE tags (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    created DATETIME,
    modified DATETIME,
    UNIQUE KEY (title)
);

CREATE TABLE bookmarks_tags (
    bookmark_id INT NOT NULL,
    tag_id INT NOT NULL,
    PRIMARY KEY (bookmark_id, tag_id),
    FOREIGN KEY tag_key(tag_id) REFERENCES tags(id),
    FOREIGN KEY bookmark_key(bookmark_id) REFERENCES bookmarks(id)
);

データベース設定ファイルの編集

/config/app.phpの内容を変更します。

return [
    // More configuration above.
    'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',
            'username' => 'cakephp',
            'password' => 'AngelF00dC4k3~',
            'database' => 'cake_bookmarks',
            'encoding' => 'utf8',
            'timezone' => 'UTC',
            'cacheMetadata' => true,
        ],
    ],
    // More configuration below.
];

ここまで完了したらルートにアクセスして、データベースのエラーがなければOKです。

スキャットフォールド(簡易)コードの生成

CakePHP命名規則にDBが従っていれば、bakeコマンドを使ってソースを自動生成できます。
コマンドで以下を入力して実行してください。

bin/cake bake all users
bin/cake bake all bookmarks
bin/cake bake all tags

http://localhost:****/bookmarksにアクセスすれば、基本的な画面や機能はできているはずです。
f:id:seintoseiya:20160122214303p:plain

自動生成されたコードの内容

チュートリアルではこの後に「パスワードハッシュを追加」や「ブックマークをタグで探す」などの機能を追加していますが、
自動生成されたコードの意味を知る方が大切なので、ちょっと内容を確認してみます。

MVCファイルの場所

前回のcakephp2.xの時はModel, View, Controllerがフォルダでありましたが、
cakephp2.xではsrcの中にそれぞれあります。

Controllerはcakephp2.xと同様にControllerフォルダ直下にファイルを生成していきます。

Modelは「Entity」と「Table」というフォルダにファイルが分けられていて、
「データベースのデータをPHPのオブジェクトとして扱うようにしたもの」がEntityで、
「テーブルとの間でやり取りするための仕組みを提供するもの」がTableとされています。
2つに分けることで、クエリの最適化が行い易くなり無駄なリソースを消費するという事態を減らすことができる様です。

Viewでは実際に画面表示用のテンプレートを配置する場所は「Template」フォルダになります。
「Template」-「Layout」フォルダの中にある「default.ctp」でページ全体のレイアウトを記述できます。

生成されたコード

上記のbake allを実行すると以下のようなファイルが自動生成されます。

Controller/BookmarksController.php
Model/Entity/Bookmark.php
Model/Table/BookmarksTable.php
Template/Bookmarks/add.php
Template/Bookmarks/edit.php
Template/Bookmarks/index.php
Template/Bookmarks/view.php

Controllerの内容を確認すると、
「index」「add」「edit」「view」「delete」というい5つのアクションメソッドが作成され、
CRUDの基本機能が自動的に実装されていることがわかるかと思います。

この他にも「tests」フォルダの中にも、以下のようなテスト用ソースコードファイルが生成されています。

Fixture/BookmarksFixture.php
TestCase/Controller/BookmarksControllerTest.php
TestCase/Model/Table/BookmarksTableTest.php