CakePHP3.0のブックマークチュートリアル

CakePHP3.0の概要を一番手っ取り早く知るには、チュートリアルを実行しながら、勉強していくのが一番だと思うので、CakePHPで用意してある2つのチュートリアル、①ブックマークチュートリアルと②ブログチュートリアルを実際に手を動かしながら操作してみたいと思います。

まず、ブックマークチュートリアルです。インストールしたばかりのトップページ真ん中あたりに、Getting Startedの見出しがあり、CakePHP 3.0 DocsとThe 15 min Bookmarker Tutorial、The 15 min Blog Tutorialがあります。

その中の、The 15 min Bookmarker Tutorialをクリックします。

ブックマークプロジェクトのインストール

まず、説明の通り、bookmarkerプロジェクトを作成します。コマンドプロンプトから下記のように入力します(XAMPPでの例です)。

cd C:\xampp\htdocs
composer create-project --prefer-dist cakephp/app bookmarker

Set Foledr Permissions? と訪ねてきたら、y と入力して、Enterすると、bookmarkerプロジェクトは完成します。

自分で使用中のIDEで、このbookmarkerプロジェクトを操作できるように設定します。

PhpStormの場合

File→NewProjectでCreate New Projectのダイアログが開いたら、Project name:にbookmarker(任意)、Location:にC:\xampp\htdocs\bookmarker、Project type: に、composer projectを選択して、OKをクリックします。

2015-04-30 18-48-15

そのディレクトリは、空ではありませんが、新しいプロジェクトを作成しますかと訪ねてきますので、Yesをクリックします。

Open Projectのダイアログが表示されたら、This Windowをクリックします。

これで、bookmarkerプロジェクトが作成されました。

NetBeansの場合

ファイル→新規プロジェクトで新規プロジェクトダイアログが表示されたら、カテゴリはPHP、プロジェクトは、既存のリソースを使用するPHPアプリケーションを選択して、次ボタンをクリックします。

2015-04-30 18-54-40

ソースフォルダに、C:\xampp\htdocs\bookmarker、プロジェクト名にbookmarker(任意)、PHPのバージョンは、XAMPPのPHPバージョンに合わせて選択し、次ボタンをクリックします。

2015-04-30 18-59-11

実行構成の、実行方法は、ローカルWebサイト(ローカルWebサーバーで実行中)を選択し、プロジェクトURLと開始ファイルは、デフォルトのまま、終了ボタンをクリックすれば、新規プロジェクトは作成されます。

2015-04-30 19-05-41

データベースの作成

次に、データベースを作成するのですが、config/app.phpの222-224行目を下記の様に修正します。

'username' => 'root',
'password' => '1234', //phpMyAdminのパスワード
'database' => 'bookmarker',

修正したら、localhost/phpmyadminとブラウザに入力して、phpMyAdminを起動します。ユーザー名とパスワードを入力して、実行ボタンをクリックします。

phpMyAdminのトップページが開いたら、左メニューのNewをクリックして、データベース名をbookmarker、照合順序をutf8_unicode_ciにして、作成ボタンをクリックします。

2015-04-30 19-23-11

データベースが作成されたら、CakePHPのチュートリアルページのCreating the Database項目にあるSQLをコピーして、

2015-04-30 19-27-19

phpMyAdminのbookmarker→SQLにペーストして、実行をクリックします。

2015-04-30 19-31-19

これで、bookmarkerデータベースに4つのテーブル(bookmarks、bookmarks_tags、tags、users)が作成されました。

2015-04-30 19-34-27

スキャフォールドの作成

次に、上記の4つのテーブルのうち、bookmarksとtagsとusersのスキャフォールドを作成します。

コマンドプロンプトから、下記の様に入力します。

cd c:\xampp\htdocs\bookmarker
bin\cake bake all users
bin\cake bake all bookmarks
bin\cake bake all tags

2015-04-30 19-43-15

これで、src/Controllerに

  1. BookmarksController.php
  2. TagsController.php
  3. UsersController.php

src/Modelの、Entityフォルダに

  1. Bookmark.php
  2. Tag.php
  3. User.php

src/ModelのTableフォルダに、

  1. BookmarksTable.php
  2. TagsTable.php
  3. UsersTable.php

src/Templateフォルダに、下記の各フォルダ

  1. Bookmarks
  2. Tags
  3. Users

上記の各テンプレートフォルダ内に、

  1. add.ctp
  2. edit.ctp
  3. index.ctp
  4. views.ctp

のテンプレートファイルが作成されています。

2015-04-30 19-52-17

ここまでできたら、localhost/bookmarkers/usersとブラウザに入力してみると、下記の様に既にアプリケーションが完成しています。

2015-04-30 19-56-48

パスワードハッシャーの作成

上記の左メニューから、New Userをクリックすれば、新しいユーザーが作成できるのですが、CakePHP3.0は、デフォルトでは、パスワードを暗号化してくれません。そこで、入力したパスワードを暗号化するために、パスワードハッシャーを作成するために、Userモデルを修正します。

src/Model/Entity/User.php

<?php namespace App\Model\Entity; 
use Cake\ORM\Entity; 
use Cake\Auth\DefaultPasswordHasher; //追加
class User extends Entity {
protected $_accessible = [
        'email' => true,
        'password' => true,
        'bookmarks' => true,
    ];
    //パスワードハッシャーを追加
    protected function _setPassword($value)
    {
        $hasher = new DefaultPasswordHasher();
        return $hasher->hash($value);
    }
}

上記の3行目と、10-15行目を追加します。これは、パスワードフィールドの値を入力すると、自動的にパスワードはハッシュ化(暗号化)してくれます。

新規ユーザーの作成

それでは、実際にユーザーを作成してみましょう。先ほどのページからNew Userをクリックし、ユーザー作成のページへ移動したら、EmailとPasswordを入力して、SUBMITボタンをクリックします。

2015-04-30 20-17-59

下記の様にパスワードが暗号化されているのがわかります。只、パスワードが長すぎて、Createdや、Modified、はたまた、Actionsまで侵食してちょっと見にくいですね。

2015-04-30 20-25-10

どうせパスワードは、暗号化しているので、リストに表示する必要は、ありませんので、パスワードの欄をリストから削除しましょう。

src/Template/index.phpの15行目と26行目(下記)を削除します。

15行目:<th><?= $this->Paginator->sort('password') ?></th>
26行目:<td><?= h($user->password) ?></td>

これで、すっきりしました。

2015-04-30 21-08-30

タグからブックマークの取得

公式サイト通りに、作成していきます。まず、ルータに下記のコードを追加します。

config/routes.php

Router::scope(
 '/bookmarks',
 ['controller' => 'Bookmarks'],
 function ($routes) {
 $routes->connect('/tagged/*', ['action' => 'tags']);
 }
);

「http://localhost/bookmarker/bookmarks/tagged/*」を、BookmarksControllerのtagsアクションへルーティングしています。

そして、BookmarksControllerに上記でルーティングしたtagsアクションを追加します。

src/Controller/BookmarksController.php

public function tags()
{
 $tags = $this->request->params['pass'];
 $bookmarks = $this->Bookmarks->find('tagged', [
 'tags' => $tags
 ]);
 $this->set(compact('bookmarks', 'tags'));
}

3行目:変数$tagsにパラメーターのパスの値、bookmarks/tagges/* の * の値を代入しています。

4行目:変数$bookmarksにBookmarksTableモデルのfindTaggedメソッドの結果(オブジェクト)を代入しています。

7行目:ビューへ、上記(3行目と4行目)のデータを引き渡しています。

Modelに下記のメソッドを追加します。

src/Model/Table/BookmarksTable.php

public function findTagged(Query $query, array $options)
{
 $fields = [
 'Bookmarks.id',
 'Bookmarks.title',
 'Bookmarks.url',
 ];
 return $this->find()
 ->distinct($fields)
 ->matching('Tags', function ($q) use ($options) {
 return $q->where(['Tags.title IN' => $options['tags']]);
 });
}

tagsテーブルのtitleフィールドがURIの「bookmarks/tagged/*」の * の部分と一致するものを返します。たとえば、URIが「localhost/bookmarker/bookmarks/tagged/cakephp」なら、タグの値がcakephpのデータを抽出してきます。

tagsビューファイルを作成します。

src/Template/Bookmarks/tags.ctp

<h1>
 Bookmarks tagged with
 <?= $this->Text->toList($tags) ?>
</h1>

<section>
 <?php foreach ($bookmarks as $bookmark): ?>
 <article>
 <h4><?= $this->Html->link($bookmark->title, $bookmark->url) ?></h4>
 <small><?= h($bookmark->url) ?></small>
 <?= $this->Text->autoParagraph($bookmark->description) ?>
 </article>
 <?php endforeach; ?>
</section>

それでは、実際にアプリを動かしてみましょう。ブックマークとタグのデータを5~6件ずつ入力してから、ブラウザから、下記のように入力してみます。

localhost/bookmarker/bookmarks/tagged/php

2015-05-01 0-09-55

上記結果は、下記のタグの表記のタグに対するブックマークのリレーションと同じ結果となります。

2015-05-01 0-26-13

本日は、以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ