【发布时间】:2013-02-23 18:22:03
【问题描述】:
从今天开始,我开始在模型层而不是控制器中验证表单数据。我会尽量缩短代码sn-ps。
这是我的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,但我不能给用户一个正确的消息,比如“提供的姓氏太短”,因为我不知道哪个字段抛出了异常,只知道异常的类型。
我该如何解决这个问题?谢谢。
【问题讨论】:
-
为什么控制器需要知道模型层状态的变化?这种对异常的痴迷是什么?!
-
我过去的做法很好,但让控制器有点胖,所以我听说应该在模型层进行表单/日期验证,所以我开始在域的设置器中进行对象。您看到每个人都说以某种方式做到这一点,但是没有示例很难做到。如果消息不首先返回到控制器,你将如何将消息传递给视图?而且我不知道对异常的痴迷是什么,我只是在我读过的很多文章中看到它们,所以养成了我想的习惯。
-
.. 因为互联网上的每个 php 代码示例都只包含好的代码。太棒了!
标签: php oop model-view-controller exception