从今天开始,我开始在模型层而不是控制器中验证表单数据。我将尽可能缩短代码片段。
这是来自我的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()
方法将抛出 aLengthException
因为它太短了。
这就是我想要的,但是当它返回到服务层然后返回到控制器并且我抓住它时,我知道 aLengthException
被抛出但我不能给用户一个正确的消息,比如“提供的姓氏太短”因为我不知道哪个字段抛出了异常,只知道异常的类型。
我该如何解决这个问题?谢谢。