CakePHP2.X系との相違点
フォルダや設定ファイルの名前が変わっている。手順

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' => 'root',
'password' => 'xxx',
'database' => 'cake_demo',
'encoding' => 'utf8',
'timezone' => 'UTC',
'flags' => [],
'cacheMetadata' => true,
'log' => false,
~ 省略 ~

コントローラ
<?php
namespace App\Controller;
class AnimalController extends AppController
{
public function index(){
}
public function reg(){
$animal_name = $this->request->data['animal_name'];
$this->set(array(
'animal_name'=>$animal_name
));
}
}
ビュー
index.ctp
<?php
echo $this->Form->create('Animal' , ['type'=>'post','url'=>['action'=>'reg']] );
echo $this->Form->text('animal_name');
echo $this->Form->submit('送信');
echo $this->Form->end();
?>
動物名:<?php echo $animal_name?>
画面の動き
CakePHP2との相違点
CakePHP2と似ていますが、異なる箇所があります。
テーブル名とモデル名(コントローラ名)の命名変更点
CakePHP2ではテーブル名は複数系、モデル名は単数形である。| DBテーブル名 | モデル名 | |
|---|---|---|
| big_cats | BigCat | |
| statuses | Status | |
| fish | Fish | |
| fishs | 英文の複数形ルールとして正しくないのでエラー(fishの複数形はfish) |
| DBテーブル名 | モデル名 |
|---|---|
| big_cats | BigCats |
| statuses | Statuses |
| fish | Fish |
| fishs | Fishs |
アクション名の変更点
アクション名は必ずキャメル記法で記載しなければならなくなった。スネーク記法は禁止された。function fishReg() {...
function fish_reg() {...
ビュー名の変更
従来のビューはViewフォルダでなくTemplateに作成するようになった。src/Template/OkinawaFishs/fish_reg.ctp
fish_reg.ctp
fishReg.ctp
fish-reg.ctp
URLはチェーン記法で表されるようになった
http://localhost/cake3_demo/okinawa-fishs/fish-reg
サンプル
OkinawaFishsController (DBテーブル名:okinawa_fishs)
<?php
namespace App\Controller;
class OkinawaFishsController extends AppController
{
public function index(){
}
public function fishReg(){
$name = $this->request->data['name'];
$ent = $this->OkinawaFishs->newEntity($this->request->data);
$this->OkinawaFishs->save($ent);
$this->set(array(
'name'=>$name
));
}
}

ソースコード
コントローラ:AnimalsController.php
namespace App\Controller;
use Cake\Validation\Validator;
class AnimalsController extends AppController
{
public function index(){
}
public function reg(){
$animal_name = $this->request->data['animal_name'];
$ent = $this->Animals->newEntity($this->request->data);
$errors = $ent->errors();
if(empty($errors)){
$this->Animals->save($ent);
}
$this->set(array(
'animal_name'=>$animal_name,
'errors'=>$errors
));
}
}
namespace App\Model\Table;
use Cake\ORM\Table;
use Cake\Validation\Validator;
class AnimalsTable extends Table{
public function validationDefault(Validator $validator)
{
$validator
->notEmpty('animal_name','動物名は必須入力です。')
->maxLength('animal_name', 4,'動物名は4文字以内です。')
;
return $validator;
}
}
<?php
echo $this->Form->create('Animals' , ['type'=>'post','url'=>['action'=>'reg']] );
echo $this->Form->text('animal_name');
echo $this->Form->submit('送信');
echo $this->Form->end();
?>
<h2>CakePHP3 | Animal | reg</h2> 動物名:<?php echo $animal_name?><br> <br> <p>バリデーション</p> <?php var_dump($errors)?> <br>
ファイル構造

挙動
コントローラ
namespace App\Controller;
use Cake\ORM\TableRegistry;
class OkinawaFishsController extends AppController
{
public function fishList(){
$okinawaFishs = TableRegistry::get('OkinawaFishs');
$data = $okinawaFishs->getFishList1();
$this->set(array(
'data'=>$data
));
}
}
テーブルクラス(モデル)
namespace App\Model\Table;
use Cake\ORM\Table;
class OkinawaFishsTable extends Table
{
public function initialize(array $config)
{
}
public function getFishList1(){
$data = $this->find()->
where(['fish_value'=>102])->
order(['fish_date DESC'])->
limit(10)->
all();
return $data;
}
}
テンプレート(ビュー)
<table>
<thead><tr><th>id</th><th>fish_name</th><th>fish_date</th><th>fish_value</th></tr></thead>
<tbody>
<?php
foreach ($data as $ent){
echo "<tr><td>{$ent->id}</td>";
echo "<td>{$ent->fish_name}</td>";
echo "<td>{$ent->fish_date->format('Y-m-d')}</td>";
echo "<td>{$ent->fish_value}</td></tr>¥n";
}
?>
</tbody>
</table>
ソースコード
$query = $this->find()
->join([
'OkinawaFishs' => [
'table' => 'okinawa_fishs',
'type' => 'LEFT',
'conditions' => 'FishingRecs.fish_id = OkinawaFishs.id',
],
]);
$query->select([
"id"=>"FishingRecs.id",
"catch_count"=>"FishingRecs.catch_count",
"fishing_rec_date"=>"FishingRecs.fishing_rec_date",
"fish_name"=>"OkinawaFishs.fish_name",
]);
$data = $query->all();
SQLログ
SELECT
FishingRecs.id AS `id`,
FishingRecs.catch_count AS `catch_count`,
FishingRecs.fishing_rec_date AS `fishing_rec_date`,
OkinawaFishs.fish_name AS `fish_name`
FROM
fishing_recs FishingRecs
LEFT JOIN okinawa_fishs OkinawaFishs ON FishingRecs.fish_id = OkinawaFishs.id
モデル名について
テーブル名がanimalsである場合、モデル名は「Animals」である。サンプル
namespace App\Controller;
class AnimalsController extends AppController
{
public function reg(){
$data=array('animal_name'=>'タヌキ');
$ent = $this->Animals->newEntity($data);
$this->Animals->save($ent);
}
}
animalsテーブル
| id | animal_name | animal_value | animal_date | modified |
|---|---|---|---|---|
| 3 | タヌキ | NULL | 0000-00-00 | 2016/6/23 10:53 |
namespace App\Controller;
class AnimalsController extends AppController
{
public function reg(){
$data=array(
array('animal_name'=>'オオカミ'),
array('animal_name'=>'クマ'),
);
$animals = $this->Animals->newEntities($data);
$this->Animals->connection()->begin();//トランザクション開始
foreach ($animals as $animal) {
$this->Animals->save($animal);
}
$this->Animals->connection()->commit();//コミット
}
animalsテーブル
| id | animal_name | animal_value | animal_date | modified |
|---|---|---|---|---|
| 12 | オオカミ | NULL | 0000-00-00 | 2016/6/23 12:55 |
| 13 | クマ | NULL | 0000-00-00 | 2016/6/23 12:55 |
Entityクラスでできること
リンク
公式ドキュメント