見出しが示すように、3 つの構造のモデル (ドメイン オブジェクト、データ マッパー、およびサービス) を実装する際にいくつかの小さな問題が発生しています。
過去に誰かが私のサイトに登録していたとき、私は単純にそうしていました
$user->register($firstName, $lastName, $emailAddress, $username...);
そのメソッドは次のような手順で実行されます
1. Check if the form sent was valid.
2. Check if all the required fields were filled.
3. Check the if the lengths of strings were valid and the range of integers etc.
4. Check if the input is in the correct format (regex).
5. Check if the username is already taken and if the email address already exists
in the database
6. etc. etc.
それはすべて正常に機能しますが、コードをより再利用可能でテスト可能にしたいので、そのようにすることから逃れようとしています。
さて、この3つの構造モデルでは、ドメインオブジェクトとデータマッパーはサービスを介して通信し、それらを互いに分離しておく必要があるため、ここにユーザーサービスの私の考えがあります
class UserService {
public function register($firstName, $lastName, $email...) {
$userDO= $this->domainObjectFactory->build('User');
$mapper = $this->dataMapperFactory->build('User');
// Is this where I start doing my validation like in the steps above???
// And if this is where I start doing my checks, when I get to the part
// where I have to check if the username they want is already taken how
// how do I do that check?
}
}
そして、実際にそれを実行するには、コントローラーから次のように実行します
$userService = $this->serviceFactory->get('user');
$result = $userService->register($_POST['firstName']....);
ロジック (if と else の) は、私のクラスのregister()
メソッドに入れる必要がありますよね? UserService
ユーザー名が既に存在するかどうかなど、データベースがいくつかのチェックを行う必要がある段階に達したときにドメインオブジェクトに入ると、どうすればデータベースにアクセスできますか? ドメインオブジェクトはデータソースについて何も知らないはずなので、本当にわかりません。
ユーザー名や電子メール アドレスが既に存在するかどうかの確認や、実行する必要があるその他の小さなクエリの負荷など、小さなクエリのためにデータベースにアクセスする方法が必要です。
小さなクエリの負荷を実行する必要があるエンティティ/ドメイン オブジェクトがたくさんあります。過去に、モデルは任意のメソッド内からデータベースにアクセスでき、それらのクエリを実行できましたが、この 3 構造モデルでは許可されていないようです。方法がなければならないので、それを行う正しい方法は何かを知りたくてたまらない.
モデルが3つの構造に分割されたレイヤーであることがわかるまで、私はそれを飛ばしていました。
特に実生活での良い例など、正しい方向への助けやプッシュは大歓迎です。インターネットには、私の特定の問題に対するものが欠けているようです。
ありがとう。