cake3を使ってみるはず1


# bin

app/bin/*
がcomposerではいらないのでzipからおく

# di

pimpleのプラグインを使ってみる

# モデル

テーブルとエンティティがある。DDDか。
速度や効率というよりは、DDDの勉強になる感じがする。

## テーブル

下記のようにコントローラーに紐づくテーブルモデルは読み込まれる。

$this->Sandbox

そうじゃない奴はuseとか使う。

```
$sandbox_table = TableRegistry::get('Sandbox');
use Cake\ORM\TableRegistry;
```

### アソシエーション

recursiveはなくなり、containを使うようになった

## エンティティ

useしておいてnewする。

```
use App\Model\Entity\Sandbox;

$sandbox_entity = new Sandbox();

テーブルオブジェクトから生成
$sandbox = $sandbox_table->newEntity($savedata);

```

# マイグレーション

公式
http://book.cakephp.org/3.0/ja/migrations.html

phinxのマイグレーションらしい
http://docs.phinx.org/en/latest/migrations.html

バージョン２に比べてファイルベースになったので自動差分とかがなくなった

## 新規テーブル

http://book.cakephp.org/3.0/ja/migrations.html#id9

bakeで作れるけど、マイグレーション名に気をつけないといけない。そうじゃないとうまく動かない。
（日本語ドキュメントに「従うことができます」とあるが誤訳かなあ。）

> (/^(Create)(.*)/) 指定したテーブルを作成します。
(/^(Drop)(.*)/) 指定したテーブルを削除します。フィールドの指定は無視されます。
(/^(Add).*(?:To)(.*)/) 指定したテーブルにカラム追加します。
(/^(Remove).*(?:From)(.*)/) 指定のテーブルのカラムを削除します。
(/^(Alter)(.*)/) 指定したテーブルを変更します。 CreateTable と AddField の別名。

新規テーブルの流れ

```
$ bin/cake bake migration CreateHogeTable label:string name:string created modified
$ bin/cake bake migration CreateHogeTable2 label:string name:string created modified
$ bin/cake migrations migrate
$ bin/cake bake model CreateHogeTable1
$ bin/cake bake model CreateHogeTable2
```

また、この際に、up(),down()にならずにcreate()になるので注意。
Addでも同様だった。手動で記述かな。
たぶん、この辺りはマイグレーションプラグインのバージョンにも注意。

## snapshot（リバースエンジニアリング）

cakephp2より弱くなっているが、initでリバースできるっぽい
テーブル指定できたら便利なのになあ

スナップショットから切り出してマイグレーションを作るようにするつもり
でも、面倒だしスナップショットのままでもいいかもしれない
スナップショットではchangeではなくup,downのメソッドで生成される
どういう思想でそうなってるんだろうな

```
# 全部のテーブルで生成
bin/cake bake migration_snapshot Initial

# Teble Class 定義済みに限定（本来的なスナップショットに使えそう）
bin/cake bake migration_snapshot Initial --require-table
```

## マイグレーションを消す

ロールバックは全部履歴を辿って戻してしまう。
手動で対応するなどしてからマイグレーションファイルとDBの該当行を削除するなどで対応できる。

# jsonbの対応

migrationはできた
jsonにもjsonbにも書き込みとかもできた

```
{"key1":"value1","key2":"value2"}

```

検索とかはうまくできるかしら。
多分大丈夫だよね。

# Bakery

あれ、関係ないけどこのサイトってSphinxで作られてるのね。

http://bakery.cakephp.org/

# ツリー

オプション無しで以下の手順で作るとアソシエーションが邪魔で上手く動かないので調整が必要。

```
migration create
bake model
```

modelにtreeを追加していても、モデルとしての動作は行えた

ビュー例

* http://web.mt-systems.jp/tech/cakephp/treebehavior

ヘルパー

* http://bakery.cakephp.org/2012/03/15/TreeLiHelper.html
* https://github.com/imsamurai/CakePHP-TreeHelper

# シーダー

DB初期データをいれたりするphinxの機能を呼び出せる
追加と更新はあるけど削除はメソッドがないっぽい
強引にTableRegistryでテーブルオブジェクトを呼び出したりもできたけど、、
ちゃんと理解してシードとシェルとマイグレーションを綺麗に使うわけしたほうがいいのかもしれない。
シードのソースの指定はスラッシュを含む階層の指定でも大丈夫だった。Seeds/TestSeedsとか。

```
# bake
bin/cake bake seed MySeed --table MySeed

# 実行
bin/cake migrations seed --seed MySeed

# 実行　別ディレクトリ
bin/cake migrations seed --seed TestMySeed --source "Seeds/TestSeeds"
```

# アカウント管理

ひとまずライブラリ２つを使う
下記エラーは、DBにコマンドでApp/isAuthorizedのACOを足せば大丈夫になった

```
Aco: App/App/isAuthorized [ROOT\vendor\cakephp\acl\src\Model\Table\PermissionsTable.php, line 91]

bin/cake acl.acl create aco controllers App
bin/cake acl.acl create aco App isAuthorized

```

## 用語・概念

* ACL
	* Access Control List
	
* ACO
	* Access Control Object

* ARO
	* Access Request Object

CakePHP3のACLでアクセス管理 - Qiita
http://goo.gl/cTCCG8

mattmemmesheimer/cakephp-3-acl-example
https://goo.gl/M8CRkA

## チェック

```
Debugger::log($this->isAuthorized($this->Auth->user()));
```

# bakeパターン

とりあえず全部作成パターン

```
# マイグレーション作成（テーブル名には注意）
bin/cake bake migration CreateWidgets name:string[100] part_no:string[11] quantity:integer[11]

# 確認
bin/cake migrations status

# 生成
bin/cake migrations migrate
bin/cake bake all widgets

# 権限データ更新（コントローラー追加時など）
bin/cake acl_extras aco_update
```

ACL

```
# 新規権限データ
bin/cake acl_extras aco_sync

# 権限データ更新（コントローラー追加時など）
bin/cake acl_extras aco_update

# 権限確認
bin/cake acl.acl view aco

# 権限追加
bin/cake acl create aco App isAuthorized

# 権限削除
bin/cake acl delete aco 999

# CRADプラグインの際の権限追加メモ（Appにpublicメソッドを追加）
bin/cake acl create aco App invokeAction
bin/cake acl create aco App isAction

```

# Cell

ビューに特化した簡易なコントローラー
ランダム表示などちょっとした制御に利用するらしい

http://bashalog.c-brains.jp/15/12/31-100000.php

# AOP

cakeevent
event dispatcher
とかでアスペクト思考もできる気がするらしい

# 他言語対応

エラーメッセージを日本語にする意味でも。

Internationalization & Localization
http://goo.gl/jdA10K

CakePHP3を触ってみました　〜ちょっとだけグローバル気分〜 | 日記の間 | あかつきのお宿
http://goo.gl/ujA65w


```
# /binまでのパス/cake i18n
```