第6章 · 初心者向け
CRUD
データの基本は4つだけ。作る・読む・更新・削除です。
1. CRUDとは
Create 作る / Read 読む / Update 更新 / Delete 削除
TODOアプリも会員管理も、ほとんどこの組み合わせです。
2. 一覧表示(Read)
public function index()
{
$todos = $this->Todos->find()->all();
$this->set(compact('todos'));
}
「全部取って画面へ渡す」だけのシンプルな形です。
3. 詳細表示(Read)
public function view($id = null)
{
$todo = $this->Todos->get($id);
$this->set(compact('todo'));
}
4. 新規登録(Create)
流れ(暗記用)
- 空のEntityを用意
- POSTなら入力を流し込む
- save できたら Flash+一覧へ
- 失敗ならエラー表示
public function add()
{
$todo = $this->Todos->newEmptyEntity();
if ($this->request->is('post')) {
$todo = $this->Todos->patchEntity($todo, $this->request->getData());
if ($this->Todos->save($todo)) {
$this->Flash->success('登録しました');
return $this->redirect(['action' => 'index']);
}
$this->Flash->error('登録に失敗しました');
}
$this->set(compact('todo'));
}
5. Entityの作成
$todo = $this->Todos->newEmptyEntity(); // 空
$todo = $this->Todos->newEntity(['title' => '原稿']); // 最初から値あり
6. patchEntity()
フォームの入力をEntityに貼り付け+チェック(バリデーション)
$todo = $this->Todos->patchEntity($todo, $this->request->getData());
7. save()
DBに保存。成功したらデータ、失敗したら false
if ($this->Todos->save($todo)) {
// 成功
}
8. 更新(Update)
新規との違いは「先に既存データを get する」ことです。
public function edit($id = null)
{
$todo = $this->Todos->get($id);
if ($this->request->is(['post', 'put', 'patch'])) {
$todo = $this->Todos->patchEntity($todo, $this->request->getData());
if ($this->Todos->save($todo)) {
$this->Flash->success('更新しました');
return $this->redirect(['action' => 'index']);
}
$this->Flash->error('更新に失敗しました');
}
$this->set(compact('todo'));
}
9. 削除(Delete)
public function delete($id = null)
{
$this->request->allowMethod(['post', 'delete']);
$todo = $this->Todos->get($id);
if ($this->Todos->delete($todo)) {
$this->Flash->success('削除しました');
} else {
$this->Flash->error('削除に失敗しました');
}
return $this->redirect(['action' => 'index']);
}
なぜ allowMethod?
URLを直接開いただけ(GET)で消えないようにする安全策です。
10. バリデーション
入力ルール。「タイトル必須」などをTableに書く
public function validationDefault(Validator $validator): Validator
{
$validator
->scalar('title')
->maxLength('title', 100)
->notEmptyString('title');
return $validator;
}
第6章 CRUD総合演習
EXERCISE
- index / view / add / edit / delete の骨格を写経する
- title 必須バリデーションを入れる
- 成功・失敗で Flash を出し分ける