CakePHP3のdev preview1がリリースされたのでちょっと試してみた

みなさんこんにちは!

ついにCakePHP3のdev preview 1が出ましたね!
CakePHP 3.0.0 dev preview 1 released

テンション上がったので少しですが試してみようと思います。
CakePHP自体の開発スピードが最近上がってきたと感じるのでわくわくしてます。
それでは一緒にいじっていきましょう!

CakePHP3をインストールする

CakePHP3からComposerが必須になったのでComposerからインストールします。

$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar create-project -s dev cakephp/app .

これでインストール完了です!簡単!ひゃっほーい!

CakePHP2からはdatabase.phpがなくなり、app.phpに統合されたのでapp.phpからデータベースの設定を行いましょう。
これでとりあえずインストール完了です。
おそらくCakePHP3の安定版ではデータベース設定もbake出来るとは思うのですが今のところbakeが動かないようなので手動で設定しました。

これでいつもの緑画面が出てきたと思います。(DebugKitは気分的に入れてみました。オールグリーン、気持ちいいので)

データベースには以下のテーブルとデータを挿入しました。

CREATE TABLE IF NOT EXISTS `posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `content` text NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ;

INSERT INTO `posts` (`id`, `title`, `content`, `created`, `modified`) VALUES
(1, 'test1', 'test1の内容です', NOW(), NOW()),
(2, 'test2', 'test2の内容です', NOW(), NOW()),
(3, 'test3', 'test3の内容です', NOW(), NOW());

次で実際に触ってみます。

コードを書いてみる

今回やることはさきほど入れたデータを表示したりCakePHP3から実装されたEntityやRepositoryを使って遅延評価を行ったりしてみたいなぁと思います。

それでは早速書いていきましょう。

まずはPostsController.phpから書いていきます。

PostsController.php

set('posts', TableRegistry::get('Posts')->find('all'));
    }
}

namespaceとかuse使ってる部分がモダンw
見ればわかるとは思いますが、Postsテーブルのインスタンスを作り、全件取得しています。
それをViewにpostsという変数名でオブジェクトを流し込んでいます。
namespaceにはそのファイルの場所名を書きます。今回のControllerであればApp/Controller以下にあるので上記のようになっています。

それではModelを書いていきましょう。
僕もまだEntityやRepositoryは厳密にどのようなものか理解出来ていないのですが、Entityにはモデルのロジックを、Repositoryにはデータベースのリレーションやバリデーションを書いていくようです。(あんまわかってない。誰か教えて!)

まずRepositoryのほうから作ります。

App/Model/Repository/PostsTable.php


今回はリレーションやバリデーションはかけないので何も書きません。
次にEntity

App/Model/Entity/Post.php


Entityのほうには後から関数を定義してみようと思います。

そして最後にView
これでとりあえず動くはずです。

App/View/Posts/index.ctp


    id;?>

これで以下の画像のように数字が出てくるはずです。

foreach$postsをイテレートしてidを表示してみました。もちろんidの部分をtitlecontentに変えればそれを表示することが出来ます。

Viewに渡されたオブジェクトからEntityモデルを叩く

今回はViewに$postsという変数名でオブジェクトを渡しましたが、ここからPostEntityを叩くことが出来ます。

App/Model/Entity/Post.phpにメソッドを追加します。

App/Model/Entity/Post.php

public function getFullContent(){
    return $this->_properties['title'] . ":" . $this->_properties['content'];
}

そしてViewも変えます。

App/View/Posts/index.ctp


    full_content . "
";?>

これで以下のような表示が出来ます。

Entityのほうでgetから始めた関数はViewのオブジェクト側でgetを除いたアンダースコア記法で呼び出せるのです!
これ超ベンリ!感動しちゃいました。Railsの感覚に近い。。

最後に

僕も対してわかっていないのでとりあえず動かしてみてこういうことが出来る、こういうことが出来なくなった、というのを1つずつ確認している段階です。
また開発バージョンなのでこれから変更がかかる可能性があります。
開発が終わるのがいつになるかわかりませんが、少しずつでも追っかけていると移行が早く出来て便利かもしれませんね!

CakePHPをこれから始めたい人は持っておくといいかも

参考文献

CakePHP3公式APIドキュメント
CakePHP3公式BOOK – Table objects
CakePHP3公式BOOK – Entities
第3回 週末ランサーズにてCakePHP3についての講演をしました