CakePHP3でログインのシステムを作る

ユーザーテーブルの作成

テーブル名: sample_lists (InnoDB)

カラム名 属性
id int(8)
member_id varchar(128)
user_name varchar(128)
password varchar(256)
auth_flag tiny(8)
update datetime
create datetime
del_flag int(2)

ユーザー登録の実装

Formからユーザー登録できるようにしておく。EmailとPasswordを入力できるようにしておく。

  • ルーティング /regist
  • コントローラー app/src/Controller/RegistController.php
  • テンプレート app/src/Template/Regist/index.ctp

EmailとPasswordのテーブルへのインサート

  • app/src/Template/Regist/index.ctp [入力]
  • app/src/Template/Regist/regist.ctp [登録]

  • $this->render(‘index’); POSTがない場合

  • $this->render(‘regist’); POSTがある場合
[app/src/Template/Regist/index.ctp 入力]
<form action="/regist" method="post" >
    <div>Email: <input type="text" name="email"></div>
    <div>Password: <input type="text" name="password"></div>
    <input type="submit" value="登録する">
</form>
class RegistController extends AppController
{

    public function initialize()
    {
        $this->viewBuilder()->layout('base');
    }

    public function index()
    {
        if ($this->request->is('post')) {           
            $this->render('regist');
        } else {
            $this->render('index');
        }
    }
}

Modelクラスの作成

データベーステーブルのモデルを作成します。EntityクラスとTableクラスを作成します。Entityクラスは主にDBのデータ関連を扱い、Tableクラスは主にデータベーステーブルの構造を扱います。
普通はbakeします。

$ bin/cake bake model sample_lists

Welcome to CakePHP v3.2.5 Console
---------------------------------------------------------------
App : src
Path: /home/saba22/app/src/
PHP : 5.5.31
---------------------------------------------------------------
One moment while associations are detected.

Baking table class for SampleLists...

Creating file /home/saba22/app/src/Model/Table/SampleListsTable.php
Wrote `/home/saba22/app/src/Model/Table/SampleListsTable.php`
Deleted `/home/saba22/app/src/Model/Table/empty`

Baking entity class for SampleList...

Creating file /home/saba22/app/src/Model/Entity/SampleList.php
Wrote `/home/saba22/app/src/Model/Entity/SampleList.php`
Deleted `/home/saba22/app/src/Model/Entity/empty`

Baking test fixture for SampleLists...

Creating file /home/saba22/app/tests/Fixture/SampleListsFixture.php
Wrote `/home/saba22/app/tests/Fixture/SampleListsFixture.php`
Deleted `/home/saba22/app/tests/Fixture/empty`
Bake is detecting possible fixtures...

Baking test case for App\Model\Table\SampleListsTable ...

Creating file /home/saba22/app/tests/TestCase/Model/Table/SampleListsTableTest.php
Wrote `/home/saba22/app/tests/TestCase/Model/Table/SampleListsTableTest.php`

自動的にいろいろファイルが作成されます。

Entityを使ってデータを登録する

コントローラでModelをロードします。イニシャライズのところでModelのオブジェクトを呼び出す感じです。

public function initialize()
{   
    ....
    $this->loadModel('SampleLists');
    ....
}

コントローラ内でエンティティを操作しつつ、値を登録保存します。newEntityしてオブジェクトをつくって、patchEntityにてエンティティにPOST値をマージします。最後にsaveという段取り。

....
$entity = $this->SampleLists->newEntity();
$entity = $this->SampleLists->patchEntity($entity, $this->request->data());
$this->SampleLists->save($entity);
....

かなり端折っていますが、データをテーブルにインサートする流れはこのようなかたちになります。

パスワードの処理

パスワードの保存時の処理は比較的カンタンで、Entityクラスに、

use Cake\Auth\DefaultPasswordHasher;

を追加します。文字列をハッシュ化するモジュールというかライブラリーみたいなものを呼び出すってことです。内部的にはbcryptでハッシュ化してます。
それからEntityクラス本体には、以下のメソッドを追加します。

class SampleList extends Entity
{
    protected $_accessible = [
        '*' => true,
        'id' => false,
    ];

    protected $_hidden = [
        'password'
    ];

    // DefaultPasswordHasherのmethodを追加
    protected function _setPassword($password)
    {
        $hasher = new DefaultPasswordHasher();
        return $hasher->hash($password);
    }
}

こんな感じでセッターを作ってあげます。passwordという名前でカラムを作成している場合は、_setPassword()というセッターにするというcakePHP3のルールがあるのでそれを使うというわけです。app.php内で設定しているSECURITY_SALTを使っているので安全は安全です。同じパスワードでもそれぞれのシステムとして全く違う文字列として保存されます。
Entityを使って保存する場合は、このセッターを必ず通るのでハッシュ化されたパスワードが保存されます。
ということは応用編としてはここにセッターを設定してあげることで入力文字列の操作がある程度できるということになります。

フレームワークなので便利なところとそうではないところはあるのですが、例えばEmailなんかの登録をすると(ちょっと中身をまだ探索していないので何とも言えないのですが)ユニークなEmailのみの登録となります。つまり同じEmailを複数回インサートできないということです。バリデーションのところで、

'[errors]' => [
        'email' => [
            '_isUnique' => 'This value is already in use'
        ]
    ],

という値が自動的に入ってきます。
とはいっても開発にはいろいろな要求がつきまとうので、ここらのフレームワークの機能を多いに活用するか、無効にして自分で微妙な設定をしてゆくかということになります。よくある話ですが、下手くそなプログラマーは全部自分のオリジナルでやろうとしちゃう傾向ありなので、フレームワークの規約に縛った方が最終的なつくりとしてはよかろうと思います。

ログインする

登録した情報を参照してログインする機構をつくります。ここまでですでに基本的な情報登録ができるのが前提としてすすめます。

Last update: 2016.03.26 (土)