CakePHPモクモク会 #3に参加してきました。


さてさて、前回に引き続き、CakePHP3のモクモク会 #3に参加してきました。

前回のモクモク会の時はCakePHP3.0.0 -dev1だったのですが、

CakePHP3.0.0-dev2が3/12にリリースされてたので、

今回はdev2を使ってモクモクすることにしました。

という訳で、せっかく前回作った環境を一度削除し、再構築することにしました。

前回作成したディレクトリに移動し、git branchを確認します。

* cakephp3
master

NewImage

branchがcakephp3になっていることを確認し、

git pullを行います。

その後、appフォルダを一度削除します。(削除しないと、app配下が上書きされずdev2にならないようだ)

NewImage

そして、一度vagrant destroy を行い、再度vagrant up を行います。

そして、お決まりのURLにアクセスすると

http://192.168.33.40/

NewImage

しっかりと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/

NewImage

おお。。うまく行きました。

つづいて、詳細ページです。まずは一覧のタイトルにリンクを追加します。

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);

    }

実際に一覧のタイトルリンクをたどって表示してみると、

NewImage

素晴らしい!

とりあえず、今回はここまで出来ました。