【CakePHP】登録フォームからデータベースに登録する方法

# 対象の読者
CakePHPで登録フォームからデータベースに登録する方法を知りたい方

# 検証環境
■Windows11
■CakePHP(version 4.5.7)

# TableRegistry(ORMクラス)を使うと便利
<b>TableRegistryクラス</b>とは、テーブルを作るための様々な依存関係を提供します。
今回だと、TableRegistryクラスを使って、①エンティティの作成と②save()メソッドを使って登録できるといった
恩恵を受けられます。(CakePHPのTableRegiostryに関する公式情報はこちら↓)

https://book.cakephp.org/3/ja/orm/table-objects.html

早速ですが、TableRegistryクラスを使ったケースを見てみましょう。
<b>【処理の流れ】</b>
①RegisterController.phpの名前空間の下に、TableRegistryをインポートしておく。
```RegisterController.php
<?php
declare(strict_types=1);

namespace App\Controller;

use Cake\ORM\TableRegistry;/*インポートしておく*/
～(以降は、省略)～
```
②index.phpの登録フォームをRegisterController.phpの<b>register()</b>メソッドへPOST通信する。
③データを入れるためのテーブルを指定する。
```
//データを格納するための対象テーブル情報を取得する
$usersTable = TableRegistry::getTableLocator()->get('users');
```
④エンティティを新規作成する。
```
//エンティティを生成する。
$newUsers = $this->usersTable->newEmptyEntity();
```
⑤エンティティにデータを詰めていく
```
//エンティティのカラム名に画面から取得したデータを渡す
$newUsers->name = $yourName;       
$newUsers->password = $password;
$newUsers->role_id = 0;
$newUsers->created = '2024-10-01';
$newUsers->modified = '2024-10-02';
```
⑥テーブルにデータを登録する
```
//テーブルへ登録する。
$this->usersTable->save($newUsers);
```

画面からサーバにデータを渡して登録するまでの、全コードはこちらになります↓


```templates/Registers/index.php

<h1>ログインフォーム</h1>

<div class="registerFormArea">
    <form id="registerForm" class="" method="post" action="/registers/register" name="form">
        <input type="hidden" name="_csrfToken" value="<?= $this->request->getAttribute('csrfToken') ?>"/>
        <!--名前-->
        <input type="text" id="yourNAme" name="yourNAme" class="yourNAme"/>
        <!--メールアドレス-->
        <input type="email" id="yourEmail" name="yourEmail" class="yourEmail"/>
        <!--パスワード-->
        <input type="password" id="yourPassword" name="yourPassword" class="yourPassword"/>
    </form>
    <button type="submit" class="btn" form="registerForm">
        送信
    </button>
</div>

```

```RegisterController.php
<?php
declare(strict_types=1);

namespace App\Controller;

use Cake\ORM\TableRegistry;/*追加*/

/**
 * Registers Controller
 *
 * @method \App\Model\Entity\Register[]|\Cake\Datasource\ResultSetInterface paginate($object = null, array $settings = [])
 */
class RegistersController extends AppController
{    
    public function initialize(): void
    {
        parent::initialize();
        //companiesのDBを指定
        $this->usersTable = TableRegistry::get('users');
    }
    /**
     * Index method
     *
     * @return \Cake\Http\Response|null|void Renders view
     */
    public function index()
    {
        /*
        $registers = $this->paginate($this->Registers);

        $this->set(compact('registers'));
        */
    }

    /**
     * View method
     *
     * @param string|null $id Register id.
     * @return \Cake\Http\Response|null|void Renders view
     * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
     */
    public function view($id = null)
    {
        $register = $this->Registers->get($id, [
            'contain' => [],
        ]);

        $this->set(compact('register'));
    }

    /**
     * Add method
     *
     * @return \Cake\Http\Response|null|void Redirects on successful add, renders view otherwise.
     */
    public function add()
    {
        $register = $this->Registers->newEmptyEntity();
        if ($this->request->is('post')) {
            $register = $this->Registers->patchEntity($register, $this->request->getData());
            if ($this->Registers->save($register)) {
                $this->Flash->success(__('The register has been saved.'));

                return $this->redirect(['action' => 'index']);
            }
            $this->Flash->error(__('The register could not be saved. Please, try again.'));
        }
        $this->set(compact('register'));
    }

    /**
     * Edit method
     *
     * @param string|null $id Register id.
     * @return \Cake\Http\Response|null|void Redirects on successful edit, renders view otherwise.
     * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
     */
    public function edit($id = null)
    {
        $register = $this->Registers->get($id, [
            'contain' => [],
        ]);
        if ($this->request->is(['patch', 'post', 'put'])) {
            $register = $this->Registers->patchEntity($register, $this->request->getData());
            if ($this->Registers->save($register)) {
                $this->Flash->success(__('The register has been saved.'));

                return $this->redirect(['action' => 'index']);
            }
            $this->Flash->error(__('The register could not be saved. Please, try again.'));
        }
        $this->set(compact('register'));
    }

    /**
     * Delete method
     *
     * @param string|null $id Register id.
     * @return \Cake\Http\Response|null|void Redirects to index.
     * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
     */
    public function delete($id = null)
    {
        $this->request->allowMethod(['post', 'delete']);
        $register = $this->Registers->get($id);
        if ($this->Registers->delete($register)) {
            $this->Flash->success(__('The register has been deleted.'));
        } else {
            $this->Flash->error(__('The register could not be deleted. Please, try again.'));
        }

        return $this->redirect(['action' => 'index']);
    }
    
    

    public function register()
    {
        $this->request->is('post');
       
        $yourName = $this->request->getData('yourNAme');
        debug($yourName);
        $email = $this->request->getData('yourEmail');
        $password = $this->request->getData('yourPassword');
        //debug($email);
        $this->set('id',$yourName);

        //データを格納するための対象テーブル情報を取得する
        $usersTable = TableRegistry::getTableLocator()->get('users');
        //エンティティを生成する。
        $newUsers = $this->usersTable->newEmptyEntity();
        //エンティティのカラム名に画面から取得したデータを渡す
        $newUsers->name = $yourName;       
        $newUsers->password = $password;
        $newUsers->role_id = 0;
        $newUsers->created = '2024-10-01';
        $newUsers->modified = '2024-10-02';
        //テーブルへ登録する。
        $this->usersTable->save($newUsers);
        //return $this->response->withStringBody($yourName);
        return $this->redirect(['action' => 'success']);
        
    }
    

    public function success()
    {
       
        //$yourName = 1;
        
        //debug($email);
        //$this->set('yourName',$yourName);
       //return $this->redirect(['action' => 'success']);
    }
}

```

以上です。

## サンクスサイト
■カモメのススメ様　cakephp4テーブルにデータを登録する方法
■カモメのススメ様　cakephp4でコントローラーの作成手順！コントローラーの特徴も解説