cake Viewを作成

App/src/Template/

テーブル名のフォルダを作成

index.ctpファイルを作成
App/src/Template/Post/index.ctp

テーブルの配列がテーブル名で渡される。例えば、tableがteasなら、viewには、$teasでレコードがobjectで渡される。すげー。

<h1>Blog Posts</h1>

<ul>
	<?php foreach($posts as $post):?>
		<li><?= h($post->title); ?></li>
	<?php endforeach; ?> 
</ul>

cake DBtableのModelを作成

テーブル名は複数形
src/Model/Table/
HogesTable.php

ここでは
PostsTable.php

<?php
namespace App\Model\Table;
use Cake\ORM\Table;
class PostsTable extends Table
{
	public function initialize(array $config)
	{
		$this->addBehavior('Timestamp');
	}
}

やばい、完全に眠くなってきた。

composerを入れてcakeをインストール

まずローカルにcomposerを入れます。

curl -sS https://getcomposer.org/installer | php

続いて、cakeをインストール

php composer.phar create-project --prefer-dist cakephp/app myapp

cd myapp

サーバーを立てます。

bin/cake server -H 192.168.33.10 -p 8000

準備が出来ました。

DBの設定
config/app.php

'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',
            /**
             * CakePHP will use the default DB port based on the driver selected
             * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
             * the following line and set the port accordingly
             */
            //'port' => 'non_standard_port_number',
            'username' => 'my_app',
            'password' => 'secret',
            'database' => 'my_app',
            'encoding' => 'utf8',
            'timezone' => 'UTC',
            'flags' => [],
            'cacheMetadata' => true,
            'log' => false,

mvcをつくる
bin/cake bake all posts
(※postsはDBのテーブル名)

そして、192.168.33.10:8000/posts をたたくと、DBのテーブルのカラム・レコード一覧が表示される。

create table cake.posts(
	id int unsigned auto_increment primary key,
	title varchar(255),
	body text,
	created datetime default null,
	modified datetime default null
);

CommentsとPostの紐づけ

CommentsTable.php

<?php

 namespace App\Model\Table;

 use Cake\ORM\Table;
 use Cake\Validation\Validator;

 class CommentsTable extends Table
 {
   public function initialize(array $config)
   {
     $this->addBehavior('Timestamp');
     $this->belognsTo('Posts');
   }
   public function validationDefault(Validator $validator)
   {
     $validator
       ->notEmpty('body')
       ->requirePresence('body')
     return $validator;
   }
 }

PostsTable.php

<?php

 namespace App\Model\Table;

 use Cake\ORM\Table;
 use Cake\Validation\Validator;

 class PostsTable extends Table
 {
   public function initialize(array $config)
   {
     $this->addBehavior('Timestamp');
     $this->hasMany('Comments');
   }
   public function validationDefault(Validator $validator)
   {
     $validator
       ->notEmpty('title')
       ->requirePresence('title')
       ->notEmpty('body')
       ->requirePresence('body')
       ->add('body', [
         'length' => [
           'rule' => ['minLength', 10],
           'message' => 'body length must be 10+'
         ]
       ]);
     return $validator;
   }
 }

migration plugin

[vagrant@localhost ~]$ cd cake
[vagrant@localhost cake]$ cd myblog
[vagrant@localhost myblog]$ bin/cake bake migration_snapshot Initial

Welcome to CakePHP v3.3.8 Console
---------------------------------------------------------------
App : src
Path: /home/vagrant/cake/myblog/src/
PHP : 5.6.27
---------------------------------------------------------------
[vagrant@localhost myblog]$ bin/cake migrations status
Welcome to CakePHP v3.3.8 Console

 Status  Migration ID    Migration Name
-----------------------------------------
     up  20161118150335  Initial
[vagrant@localhost myblog]$ bin/cake bake migration CreateComments post_id:integer body;string created modified

 Status  Migration ID    Migration Name
-----------------------------------------
     up  20161118150335  Initial
   down  20161118150459  CreateComments


[vagrant@localhost myblog]$ bin/cake migrations migrate
 Status  Migration ID    Migration Name
-----------------------------------------
     up  20161118150335  Initial
     up  20161118150459  CreateComments

delete post

index.ctp

  <?php foreach($posts as $post) : ?>
    <!-- <li><?= $this->Html->link($post->title, &#91;'controller'=>'Post', 'action'=>'view',$post->id&#93;); ?></li> -->
    <li><?= $this->Html->link($post->title, ['action'=>'view',$post->id]); ?>
       <?= $this->Html->link('[Edit]', ['action'=>'edit',$post->id],['class'=>'fs12']); ?>
       <?=
       $this->Form->postLink(
         '[x]',
         ['action'=>'delete', $post->id],
         ['confirm'=>'Are you sure?', 'class'=>'fs12']
       );
       ?>
     </li>
  <?php endforeach; ?>

PostsController.ctp

  public function delete($id = null)
  {
    $this->request->allowMethod(['post', 'delete']);
    $post = $this->Posts->get($id);
      if($this->Posts->delete($post)){
        $this->Flash->success('Delete Success!');
      } else {
        $this->Flash->error('Delete Error!');
      }
    return $this->redirect(['action'=>'index']);
  }

Flash helper


my_layout.ctp

<body>
    <?= $this->element('my_header'); ?>
    <?= $this->Flash->render();?>
    <div class="container">
        <?= $this->fetch('content') ?>
    </div>
</body>

Posts.Controller.php

  public function add()
  {
    $post = $this->Posts->newEntity();
    if ($this->request->is('post')) {
      $post = $this->Posts->patchEntity($post, $this->request->data);
      if($this->Posts->save($post)){
        $this->Flash->success('Add Success!');
        return $this->redirect(['action'=>'index']);
      } else {
        $this->Flash->error('Add Error!');
      }
    }
    $this->set(compact('post'));
  }
}

veiw ctpの書き方


コントローラーにメソッドを追加

<?php

// /posts/index
// /posts
// /(controller)/(action)/(options)

namespace App\Controller;

class PostsController extends AppController
{
  public function index()
  {
    $posts = $this->Posts->find('all');
      // ->order(['title' => 'DESC'])
      // ->limit(2)
      // ->where(['title like' => '%3']);
    $this->set('posts', $posts);
  }

  public function view($id = null)
  {
    $post = $this->Posts->get($id);
    $this->set(compact('post'));
  }
}

src->template->view.ctp

<?php
$this->assign('title', 'Blog Detail');
?>

<h1>
  <?= $this->Html->link('Back', ['action'=>'index'], ['class'=>['pull-right', 'fs12']]); ?>
  <?= h($post->title); ?>
</h1>

<p><?= nl2br(h($post->body)); ?></p>

Postの追加: NewEntity

<h1>
  <?= $this->Html->link('Add New', ['action'=>'add'], ['class'=>['pull-right', 'fs12']]); ?>
  Blog Posts
</h1>
  public function add()
  {
    $post = $this->Posts->newEntity();
    $this->set(compact('post'));
  }

Cakeのformヘルパー: src->template->view.ctp

<?= this->Form->create($post); ?>
<?= this->Form->input('title'); ?>
<?= this->Form->input('body', ['row'=>'3']); ?>
<?= this->Form->button('Add'); ?>

<?= this->Form->end(); ?>

データの入力

if ($this->request->is('post')){
      $post = $this->Posts->patchEntity($post, $this->request->data);
      $this->Posts->save($post);
      return $this->redirect(['action'=>'index']);
    }

validation:PostsTable.php

<?php

 namespace App\Model\Table;

 use Cake\ORM\Table;
 use Cake\Validation\Validator;

 class PostsTable extends Table
 {
   public function initialize(array $config)
   {
     $this->addBehavior('Timestamp');
   }
   public function validationDefault(Validator $validator)
   {
     $validator
       ->notEmpty('title')
       ->requirePresence('title')
       ->notEmpty('body')
       ->requirePresence('body')
       ->add('body', [
         'length' => [
           'rule' => ['minLength', 10],
           'message' => 'body length must be 10+'
         ]
       ]);
     return $validator;
   }
 }

PostsController

  public function add()
  {
    $post = $this->Posts->newEntity();
    if ($this->request->is('post')) {
      $post = $this->Posts->patchEntity($post, $this->request->data);
      if($this->Posts->save($post)){
        return $this->redirect(['action'=>'index']);
      } else {
      }
    }
    $this->set(compact('post'));
  }
}

Cakeコマンド

MVCを一気に作成するbakeコマンド

[vagrant@localhost myapp]$ bin/cake bake all posts
[vagrant@localhost myapp]$ bin/cake server -H 192.168.33.10 -p 8000

データベースの条件抽出

class PostsController extends AppController
{
  public function index()
  {
    $posts = $this->Posts->find('all')
      ->order(['title' => 'DESC'])
      ->limit(2)
      ->where(['title like' => '%3']);
    $this->set('posts', $posts);
  }
}

デフォルトレイアウト
src->Template->Layout->default.ctp
レイアウトのカスタマイズ

<!DOCTYPE html>
<html lang="ja">
<head>
    <?= $this->Html->charset() ?>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>
        <?= $cakeDescription ?>:
        <?= $this->fetch('title') ?>
    </title>
    <?= $this->Html->css('styles.css') ?>
</head>
<body>
    <div class="container">
        <?= $this->fetch('content') ?>
    </div>
</body>
</html>

PostsController.phpの編集

class PostsController extends AppController
{
  public function index()
  {
    $this->viewBuilder()->layout('my_layout');
    $posts = $this->Posts->find('all');
      // ->order(['title' => 'DESC'])
      // ->limit(2)
      // ->where(['title like' => '%3']);
    $this->set('posts', $posts);
  }
}

cssファイルはwebroot/cssにあります。

titleはindex.ctpに書くことが推奨されています。

<?php
$this->assign('title', 'blog Posts');
?>

パーツ
src->header->elementに書き込み、layoutに追記

<header>My Blog</header>
<body>
    <?= $this->element('my_header'); ?>
    <div class="container">
        <?= $this->fetch('content') ?>
    </div>
</body>

PostsController.phpはclass PostsController extends AppControllerと、AppControllerを継承しているので、AppControllerのpublic function initialize()に$this->viewBuilder()->layout(‘my_layout’);を書き込むこともあります。

リンクの張り方
HTMLヘルパー

<li><?= $this->Html->link($post->title, ['action'=>'view',$post->id]); ?></li>

URLヘルパー

<a href="<?= $this->Url->build(['action'=>'view', $post-id>]); ?>">
  <?= h(post->title); ?>
</a>

Cake.phpのインストール

Cakeは人気のあるphpのwebアプリケーションフレームワークです。centOSへのインストールは、まずcomposerをディレクトリに入れます。

curl -sS https://getcomposer.org/installer | php

次に、composerを使って、cakeをインストールしていきます。
公式サイトを参考にすると、エラーなくいけると思います。
http://book.cakephp.org/3.0/en/installation.html

[vagrant@localhost cake]$ php composer.phar create-project --prefer-dist cakephp/app myapp

%e7%84%a1%e9%a1%8c

myappに移動し、コマンドラインからサーバーを立ち上げます。

[vagrant@localhost myapp]$ bin/cake server -H 192.168.33.10 -p 8000

以下のように表示されれば、OKです。
%e7%84%a1%e9%a1%8c

完了したら、configファイルのapp.phpよりDatasourcesを探し、データベースの接続を設定していきます。東京のtimezoneは’timezone’ => ‘+09:00’,です。

加えて、bootstrap.phpでもタイムゾーンを変更します。

date_default_timezone_set('Asiz/Tokyo');