Windowsで始めるCakePHP4

CakePHP4のメモ

138 views

ユーザーを追加する場合のクリーンアーキテクチャ②

入力データにバリデーションを適用する。バリデーションの処理に、Modelクラスのバリデーションを適用する。
クリーンアーキテクチャはなるべくフレームワークに依存しないようにするべき、という点でModelクラスのバリデーションを使うのはよくないらしいが、現実的には使ったほうが開発効率はよい。
本例では、バリデーションにModelクラスのバリデーションを適用した場合の例を挙げる。

ユースケース層

// src/Service/UserService.php

namespace App\Service;

use App\Model\Entity\User;
use App\Model\Table\UsersTable;

class UserService {
    private $usersTable;
    private $lastErrors = [];  // 最後のバリデーションエラーを保存するためのプロパティ

    public function __construct(UsersTable $usersTable) {
        $this->usersTable = $usersTable;
    }

    public function addUser($data): ?User {
        $user = $this->usersTable->newEntity($data);
        if ($this->usersTable->save($user)) {
            return $user;
        } else {
            $this->lastErrors = $user->getErrors();  // エンティティのエラーを保存
            return null;
        }
    }

    public function getErrors(): array {
        return $this->lastErrors;
    }
}

インターフェース層

// src/Model/Table/UsersTable.php

namespace App\Model\Table;

use Cake\ORM\Table;
use Cake\Validation\Validator;

class UsersTable extends Table {
    public function initialize(array $config): void {
        $this->setEntityClass(User::class);
    }

    public function validationDefault(Validator $validator): Validator {
        $validator
            ->notEmptyString('username', 'Username is required')
            ->minLength('username', 3, 'Username is too short')
            ->email('email', false, 'Invalid email format')
            ->notEmptyString('password', 'Password is required');

        return $validator;
    }
}

フレームワーク&ドライバ層の更新

// src/Controller/UsersController.php

namespace App\Controller;

use App\Controller\AppController;
use App\Service\UserService;

class UsersController extends AppController {
    private $userService;

    public function initialize(): void {
        parent::initialize();
        $this->userService = new UserService($this->loadModel());
    }

    public function add() {
        if ($this->request->is('post')) {
            $data = $this->request->getData();
            $user = $this->userService->addUser($data);
            if ($user) {
                $this->set('user', $user);
            } else {
                // バリデーションエラーのハンドリング
                $errors = $this->userService->getErrors();
                $this->Flash->error('There were errors in your submission.');
                $this->set(compact('errors'));
            }
        }
    }
}

Page 16 of 17.

前のページ 次のページ



[添付ファイル]

1.php_xdebug-3.0.4-8.0-vs16-x86_64.dll  


お問い合わせ

プロフィール

マッスル

自己紹介

本サイトの作成者。
趣味:プログラム/水耕栽培/仮想通貨/激辛好き
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
仮想通貨はNEMが好き。
水耕栽培は激辛好きが高じて、キャロライナ・リーパーの栽培にチャレンジ中。

サイト/ブログ

https://www.osumoi-stdio.com/pyarticle/

ツイッター

@darkimpact0626