今日から、コントローラーではなくモデルレイヤーでフォームデータの検証を開始しました。コードスニペットを可能な限り短くします。
これは私のUser
ドメインオブジェクトのメソッドです(setLastName()
メソッドは基本的に同じです)
public function setFirstName($firstName) {
if(!$firstName) throw new \InvalidArgumentException('Some message');
if( strlen($firstName) < 2 || strlen($firstName) > 20 ) throw new \LengthException('Some message');
if(preg_match('/[^a-zA-Z\'.-\s]/', $firstName)) throw new FormatException('Some message');
$this->firstName = $firstName;
}
私のコントローラーにはこのようなものがあります
$userService = $this->serviceFactory->build('User');
try {
$userService->register('John', 'M');
}
catch(\InvalidArgumentException $ex) {
}
catch(\LengthException $ex) {
}
catch(etc etc)
私のUserService
方法では、register()
私は次のようなものを持っています
$user->setFirstName($firstName);
$user->setLastName($lastName);
メソッドを実行するsetFirstName()
と、指定された名が正常に設定されます。短すぎるため、setLastName()
メソッドはをスローします。LengthException
それが私が望んでいることですが、それがサービスレイヤーに戻り、次にコントローラーに戻って、それをキャッチすると、LengthException
がスローされたことがわかりますが、「指定された姓が短すぎました」などの適切なメッセージをユーザーに与えることができません。例外がスローされたフィールドがわからないため、例外のタイプだけです。
これを回避するにはどうすればよいですか?ありがとう。