CakePHP3入門・開発チュートリアル

スポンサーリンク

CakePHP3 公式ページに掲載されているブックマーク・アプリケーションのチュートリアルをやってみました。CakePHP3 はモデルのデータを配列じゃなくてオブジェクトで取得できたり、Composer が標準で対応されたりとさらに便利になっています。

ブックマークチュートリアル – CakePHP Cookbook 3.x ドキュメント
Bookmarker Tutorial – CakePHP Cookbook 3.x documentation

公式のチュートリアルと違う方法で進めた箇所もありまして、例えばデータベースのテーブル作成にマイグレーション機能を利用している点などです。本格的な開発時にはマイグレーションを使うのは必須になりますので。

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

CakePHP 3 を使うためのシステム要件は以下をチェック。

インストール・システム要件 – CakePHP Cookbook 3.x ドキュメント

CakePHP は Rails の概念をほぼそっくりそのまま取り込んでいるので、Rails 大好きな自分の場合は PHP のフレームワークとしては CakePHP が一番好きです。というか、Rails に本格的に取り組む前は CakePHP 1.2〜2.x を使っていましたので。CakePHP をやってたおかげで Rails にも割とすんなり慣れることができました。CoC(設定より規約)のルールとか両者ともほぼ同じです。

— 環境 —
Mac OS X Yosemite 10.10.5
PHP 5.5.19
CakePHP 3.1.1

— 目次 —
CakePHP をインストール&プロジェクト作成
Git リポジトリを初期化して Git 管理にする
MySQL デーベース・ユーザー作成
Datasources 設定
マイグレーション利用のための準備
マイグレーションファイルの作成
生成したマイグレーション用ファイルの修正
マイグレーションの実行とDB確認
マイグレーションのステータス確認
マイグレーションのロールバック
スキャフォールドでMVCファイルを作成
スキャフォールドを使わずに MVC ファイルを生成
パスワードをハッシュ化
ブックマークをタグで探せるようにする
タグ・ブックマークを追加してブラウザで動作確認
ログイン認証の機能を追加
ログアウトの機能を追加
ログイン・ログアウトは認証なしでアクセス許可する
ユーザー登録の機能を有効にする
ブックマークへのアクセスをログインユーザー本人のみに制限する
ブックマークのビューとアクションを編集
ブックマーク一覧ページを改善
タグ用の入力フィールドを作成
フィールドに入力された Tag String を保存する

それでは、チュートリアル開始です!

CakePHP をインストール&プロジェクト作成

まずは、CakePHP をインストールしてプロジェクトを作成します。Composer で vendor ライブラリとして CakePHP をインストールするのが今時のやり方らしい。

フォルダのパーミッションを設定するかどうか聞かれたので Y(Yes)として設定しました。これで CakePHP のセットアップ完了。簡単!

動作確認のためにサーバー起動。

http://localhost:8765/ にアクセスして、「Get the Ovens Ready」のページが正しく表示されれば動作OKです。

Screen Shot 2015-10-31 at 16.14.56

Git リポジトリを初期化して Git 管理にする

CakePHP インストールで、デフォルトで以下の .gitignore が作成されていました。

.gitignore

とりあえず .gitignore をこのまま使って、プロジェクトのディレクトリを Git 管理下にします。

以降は git 操作についての説明は省略しますが、適宜ブランチを切ったりコミットなどを行うようにする。

MySQL デーベース・ユーザー作成

CakePHP プロジェクトで利用する DB を作成します。

データベース作成。公式チュートリアルに従って、cake_bookmarks という名前の DB を作成。DB の文字コードは utf8 を指定します。

DBユーザーが作成済みでない場合は、ユーザーも作成しておきます。

作成したユーザーの確認。

DB名(cake_bookmarks)、ユーザー名、パスワードは、次項目で config/app.php の Datasources に設定する。

Datasources 設定

config/app.php の Datasources に、DB名(cake_bookmarks)、ユーザー名、パスワードを設定する。

config/app.php

‘unix_socket’ => ‘/var/lib/mysql/mysql.sock’ 追加に注意。MySQL ソケットのパスを指定する。

マイグレーション利用のための準備

デフォルトのスケルトンで、vendor/cakephp/migrations が入っており CakePHP 3 ではデフォルトでマイグレーションが利用可能になっています。

config/bootstrap.php

config/bootstrap.php で上記が記載されていることを確認。なければ追記する。

マイグレーションファイルの作成

公式チュートリアルを参考に以下のDBテーブルを作成する。

users
bookmarks
tags
bookmarks_tags

以下コマンドを実行して、必要なマイグレーションファイルの一式を作成します。

config/Migrations/ 内にマイグレーションファイルが生成されます。

CakePHP のマイグレーションについては以下ページ等を参考。

Migrations – CakePHP Cookbook 3.x ドキュメント
cakePHP3でbake migrate – Qiita
Schema System – CakePHP Cookbook 3.x documentation

CakePHP のマイグレーションは Phinx というライブラリが担っており、CakePHP 3 ではデフォルトで vendor 以下に入っています。

Phinx
https://github.com/robmorgan/phinx

生成したマイグレーション用ファイルの修正

コマンドで作成したマイグレーションファイルの修正を行う。必要に応じて addIndex や addForeignKey 追加の修正を行う。Phinx のドキュメントが参考になります。

Writing Migrations – Phinx 0.4.6 documentation

config/Migrations/***_create_users.php

config/Migrations/***_create_bookmarks.php

config/Migrations/***_create_tags.php

config/Migrations/***_create_bookmarks_tags.php

マイグレーションの実行とDB確認

マイグレーション用のファイルを修正し終えたら、マイグレート実行です。以下のコマンドを実行します。

これで、必要なテーブルが一気に作成されました。

DB 確認。

DB テーブル確認。

Foreign Key の確認。

マイグレーションのステータス確認

マイグレーションのステータスを確認するには以下のコマンドを実行する。Rails でいう rake db:migrate:status です。

Status が up となっているのが適用済みのマイグレーション。まだ実行されていないマイグレーションは Status が down と表示される。Rails といっしょ。

マイグレーションのロールバック

適用せたマイグレーションを元に戻して、マイグレーション実行前の DB 状態に戻したい場合はロールバックを行えます。これも Rails と同じ感じで使えて便利。

ロールバック後にマイグレーションのステータスを確認。

最後のぶんのマイグレーションがロールバックされて、Status が down となっています。

スキャフォールドでMVCファイルを作成

続いて、公式チュートリアル通りにスキャフォールドを使って、MVC のファイルを自動生成してみます。これまでの作業で CakePHP の規約に従っているので、スキャフォールディングによる自動生成が可能です。

bake コマンドによるスキャフォールドで、以下のファイル群が生成されました。

モデル
src/Model/Table/UsersTable.php
src/Model/Entity/User.php

モデル・テスト
tests/Fixture/UsersFixture.php
tests/TestCase/Model/Table/UsersTableTest.php

コントローラー
src/Controller/UsersController.php

コントローラー・テスト
tests/TestCase/Controller/UsersControllerTest.php

ビュー(Template)
src/Template/Users/index.ctp
src/Template/Users/view.ctp
src/Template/Users/add.ctp
src/Template/Users/edit.ctp

Rails とほぼ同様なのでとても分かりやすい。

他のモデルについてもスキャフォールドを実行する。

bookmarks_tags はブックマークとタグを多対多で関連付けるためだけの中間テーブルなので、スキャフォールドしない。

ここまでできたら、サーバーを起動してブラウザで動作確認してみます。

http://localhost:8765/bookmarks/ にアクセス。スキャフォールドで自動生成されたブックマーク・アプリケーションが動作するのを確認できるかと思います。

スキャフォールドを使わずに MVC ファイルを生成

スキャフォールドを使わずにモデル、コントローラー、ビューのファイルを個別に生成するには、以下のように bin/cake bake コマンドを使う。

CakePHP、MySQLのビューテーブルでbakeしてみる – Qiita

パスワードをハッシュ化

試しに http://localhost:8765/users/add からユーザーを追加してみます。

Email: email@example.com
Password: password

でユーザーを追加。

http://localhost:8765/users のページで、パスワードがそのまま平文で表示されており、これはちょっとまずいですので、パスワードを暗号化(ハッシュ化)して保存するようにします。

モデル・エンティティのファイルにパスワードをハッシュ化するコードを追加して、以下のように編集する。

src/Model/Entity/User.php

もう一度 http://localhost:8765/users/add からユーザーを追加してみます。

Email: email2@example.com
Password: password

でユーザーを追加。http://localhost:8765/users で確認すると、ハッシュ化して保存されたパスワードが表示されています。

ブックマークをタグで探せるようにする

Bookmark にオブジェクトを保存した後に、タグで検索できるようにする。具体的には…

http://localhost:8765/bookmarks/tagged/funny/cat/gifs

の URL で funny, cat, gifs のいずれかのタグが付けられたブックマークを検索して一覧表示できるようにします。

config/routes.php(ルーティング)

まずはルーティングの設定。

続いて、BookmarksController に tags アクションを追加。

src/Controller/BookmarksController.php(コントローラー)

BookmarksController の tags アクション内で使っている find(‘tagged’) を実行するための find メソッドを、Bookmarks のモデル(BookmarksTable)に実装します。

src/Model/Table/BookmarksTable.php(モデル)

findTagged() メソッドを BookmarksTable.php に実装することで、BookmarksController で find(‘tagged’) メソッドが動作するようになるという仕組みらしい。

捕捉… Model/Entity/Bookmark.php と Model/Table/BookmarksTable.php の区別についてですが、モデルのインスタンスメソッドは Model/Entity に実装、find メソッドなどのクラスメソッドは Model/Table に実装という使い分けっぽい。この辺りの CakePHP3 でのモデルの区分は Rails とちょっと違っています。

src/Template/Bookmarks/tags.ctp(ビュー)

最後に tags.ctp を作成して以下の内容のビューを追記。

タグ・ブックマークを追加してブラウザで動作確認

まず、http://localhost:8765/tags/add からタグを追加します。

Title: funny
Title: cat
Title: gifs
Title: poem

以上を追加。いずれも Bookmarks は空欄にしとく。

続いて、http://localhost:8765/bookmarks/add からブックマークをいくつか追加します。

User: 1
Title: Cute cat
Description: This is a cute cat.
Url: http://example.com/cat
Tags: cat

User: 1
Title: Funny gifs
Description: These are funny gifs.
Url: http://example.com/gifs
Tags: funny, gifs(複数選択)

User: 2
Title: Good poem
Description: This is a good poem.
Url: http://example.com/poem
Tags: poem

ブラウザで、以下のURL等にアクセスする。

http://localhost:8765/bookmarks/tagged/funny
http://localhost:8765/bookmarks/tagged/cat
http://localhost:8765/bookmarks/tagged/poem
http://localhost:8765/bookmarks/tagged/funny/gifs
http://localhost:8765/bookmarks/tagged/funny/cat
http://localhost:8765/bookmarks/tagged/funny/cat/gifs

などにアクセスして、http://localhost:8765/bookmarks/tagged/**/**/** の URL に含まれるいずれかのタグで、ブックマークが検索されて一覧表示できることを確認します。

これでブックマークチュートリアルの Part 1 は終了です。一応 CakePHP 製のアプリケーションが動作するようになりました。ブックマークチュートリアルの Part 2 のドキュメントは、本日時点(2015/10/31)ではまだ日本語翻訳されておらず英語のみですが、以下英語のチュートリアルを参考にして引き続き進めます。

Bookmarker Tutorial Part 2 – CakePHP Cookbook 3.x documentation

Bookmarker Tutorial Part 2 では、認証・認可、ビュー周りの改善などを行います。

ログイン認証の機能を追加

ログイン認証を実装するために、AppController で Auth コンポーネントを読み込みます。

src/Controller/AppController.php

UsersController に login メソッドを追加。

src/Controller/UsersController.php

ログインページのビュー作成。

src/Template/Users/login.ctp

ログアウトの機能を追加

UsersController に logout メソッドを追加。

src/Controller/UsersController.php

ログイン・ログアウトは認証なしでアクセス許可する

ログイン、ログアウトのアクションは認証なしでアクセスできるようにします。

src/Controller/UsersController.php

これで、/users/logout にアクセスするとログアウトできる。

CakePHP Authコンポーネントを使ってみた | Yasigani-ni Blog
php – CakePHP 3: users not allowed to logout? – Stack Overflow

ユーザー登録の機能を有効にする

ログインしていない状態で、サインアップのために /users/add にアクセスすると、ログインページ(/users/login)にリダイレクトされる。なので、UsersController で /users/add へのアクセスは、ログインにしていない状態でも許可する。

src/Controller/UsersController.php

ブックマークへのアクセスをログインユーザー本人のみに制限する

ユーザーがログイン時に、ユーザー自身が追加したブックマークのみを操作できるように制限します。

AppController で一旦全てのアクションへのアクセスを拒否する。

isAuthorized(アクションを認可するかどうか)で false を返して、ログインしていないユーザーには、アクションを実行させないようにする。これがデフォルトの設定となり、AppController を継承する BookmarksController などで、isAuthorized() メソッドをオーバーライドして、認可するアクションを設定します。

AppController に「’authorize’ => ‘Controller’,」の行を追加。

src/Controller/AppController.php

BookmarksController で認可するアクションの設定。

src/Controller/BookmarksController.php

これでログイン中のユーザーのみ、ブックマークの閲覧(index)、タグ検索(tags)、追加(add)ができるようになる。また、ブックマークの削除(delete)、編集(edit)などの操作は、ログイン中のユーザー自身が作成したもののみ可能になります。

ブックマークのビューとアクションを編集

user_id はコントローラー側で設定するために、ビューのフォーム中の user_id のフィールドを削除します。

src/Template/Bookmarks/add.ctp
src/Template/Bookmarks/edit.ctp

上記の行を削除する。

続いて、BookmarksController#add(), BookmarksController#edit() を編集。

src/Controller/BookmarksController.php

ブックマーク一覧ページを改善

/bookmarks/index のブックマーク一覧ページで、ユーザー自身が追加したブックマークのみの一覧を表示するようにする。

src/Controller/BookmarksController.php

タグ用の入力フィールドを作成

ビューに tag_string という名前のフィールドを追加して、タグをカンマ区切りで入力できるようにします。add.ctp, edit.ctp を編集。

src/Template/Bookmarks/add.ctp
src/Template/Bookmarks/edit.ctp

に置き換える。add.ctp, edit.ctp 両方とも編集します。

tag_string フィールドから値を取得する _getTagString() メソッドを Bookmark モデルに追加。$_accessible の設定も行います。

src/Model/Entity/Bookmark.php

フィールドに入力された Tag String を保存する

src/Model/Table/BookmarksTable.php

以上で、公式のチュートリアルの内容はおしまい。残りの作業としては、BookmarksController, UsersController, TagsController で適宜アクセス制御を設定するなど。

ログインしていないユーザーにもアクセスを許可するアクションを追加するには…

を追加する。

また、アクション認可の細かな設定については…

をオーバーライドして行います。UsersController の edit, delete などについては、BookmarksController 同様に、ログイン中ユーザー自身のみに許可するように設定すべきでしょう。

これで CakePHP のブックマークチュートリアルは終了です。お疲れ様でした!記載内容に間違いなどありましたら、ご連絡頂けますと助かります。m(_ _)m

スポンサーリンク
私は Ruby on Rails の前は、PHP & CakePHP を使っていました(今も使いますけど)。PHP についてはオライリーの本を中心に軽く10冊以上は読み込みました。
 
スポンサーリンク

Leave Your Message!