さてさて、前回に引き続き、CakePHP3のモクモク会 #3に参加してきました。
前回のモクモク会の時はCakePHP3.0.0 -dev1だったのですが、
CakePHP3.0.0-dev2が3/12にリリースされてたので、
今回はdev2を使ってモクモクすることにしました。
という訳で、せっかく前回作った環境を一度削除し、再構築することにしました。
前回作成したディレクトリに移動し、git branchを確認します。
* cakephp3
master

branchがcakephp3になっていることを確認し、
git pullを行います。
その後、appフォルダを一度削除します。(削除しないと、app配下が上書きされずdev2にならないようだ)

そして、一度vagrant destroy を行い、再度vagrant up を行います。
そして、お決まりのURLにアクセスすると

しっかりとcakephp3.0.0-dev2になっています。
とりあえずこれで環境構築は完了です。
さて、今回はようやくcakephp3を使ってみることに。。。
今回の目標は追加、更新、一覧、参照、いわゆるCRADですね。を使えるようになることです。
まずは一覧表示からです。
ということで、準備として、まずDB設定から。
cakephp2まではconfig配下にdatabase.phpというのがあり、そこにもろもろを記述していたのですが、今回はありません。
App/Config/app.php にまとめられているようです。
そこで以下のように記述します。
/** * Connection information used by the ORM to connect * to your application's datastores. */ 'Datasources' => [ 'default' => [ 'className' => 'Cake\Database\Connection', 'driver' => 'Cake\Database\Driver\Mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'my_app', 'password' => 'secret', 'database' => 'cake3_blog', 'prefix' => false, 'encoding' => 'utf8', 'timezone' => 'UTC' ], /** * The test connection is used during the test suite. */ 'test' => [ 'className' => 'Cake\Database\Connection', 'driver' => 'Cake\Database\Driver\Mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'my_app', 'password' => 'secret', 'database' => 'test_myapp', 'prefix' => false, 'encoding' => 'utf8', 'timezone' => 'UTC' ], ],
続いて、データベースを作成します。
まずは
vagrant ssh でサーバにログインしてから
データベースを作成します。
create database cake3_blog default character set utf8 collate utf8_general_ci;
続いてテーブル作成
CREATE TABLE `blogs` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(50) DEFAULT NULL, `body` text, `created` datetime DEFAULT NULL, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
サンプルデータを1つ追加
INSERT INTO blogs VALUES (1,'タイトルです', '記事サンプルです', NOW(),NOW());
これでDBの準備が完了しました。
ここからいよいよcakePHP3での開発です。
まずはモデルを作ります。
残念ながらCakephp-dev2ではまだbakeが用意されていないようなので手作りです。
今回からはModelクラスではなくEntityクラスとTableクラスを作るようです。
まずはEntityクラス
/App/Model/Entity/blog.php
<?php
namespace App\Model\Entity;
use Cake\ORM\Entity;
class Blog extends Entity{
}
つづいてTableクラス
/App/Model/Table/blogsTable.php
<?php
namespace App\Model\Table;
use Cake\ORM\Table;
class BlogsTables extends Table{
}
次はコントローラークラスです。
App/Controller/BlogsController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Database\Schema\Table;
use Cake\Error\NotFoundException;
use Cake\ORM\TableRegistry;
class BlogsController extends AppController{
public $helper = array('Html');
public function index(){
$posts = TableRegistry::get('Blogs');
$this->set('blogs',$posts->find('all'));
}
}
そして、最後にViewです。
一覧ファイルです。
App/Template/Blogs/index.ctp
<h1>Blog一覧</h1>
<table>
<tr>
<th>ID</th>
<th>タイトル</th>
<th>作成日時</th>
</tr>
<?php foreach ($blogs as $blog): ?>
<tr>
<td><?php echo $blog->id; ?></td>
<td><?php echo $this->Html->link($blog->title,array('action'=>'view',$blog->id)); ?></td>
<td><?php echo $blog->created->format('Y-m-d H:i:s'); ?></td>
</tr>
<?php endforeach; ?>
<?php unset($blog); ?>
</table>
とりあえず、これで一覧が表示されるはずです。
以下をURLにアクセスして表示してみます。
http://192.168.33.40/blogs/index/

おお。。うまく行きました。
つづいて、詳細ページです。まずは一覧のタイトルにリンクを追加します。
index.ctp
<tr>
<td><?php echo $blog->id; ?></td>
<td><?php echo $this->Html->link($blog->title,array('action'=>'view',$blog->id)); ?></td>
<td><?php echo $blog->created->format('Y-m-d H:i:s'); ?></td>
</tr>
そして
App/Template/Blogs/view.ctp
<h1><?php echo h($blog->id); ?></h1>
<h1><?php echo h($blog->title); ?></h1>
<p>
<?php echo h($blog->body); ?>
</p>
<p>
<?php echo h($blog->created->format('Y-m-d H:i:s')); ?>
</p>
Blogsコントローラにメソッドを追加します。
public function view($id = null){
if(!$id){
throw new NotFoundException('不正なデータです');
}
$blogs = TableRegistry::get('Blogs');
$blog = $blogs->get($id);
if(!$blog){
throw new NotFoundException('不正なデータです');
}
$this->set('blog',$blog);
}
実際に一覧のタイトルリンクをたどって表示してみると、

素晴らしい!
とりあえず、今回はここまで出来ました。