【发布时间】:2016-03-25 11:31:27
【问题描述】:
我正在使用涉及一些 REST 的面向对象方法开发一个新应用程序,我没有使用任何框架。
我的问题是,在下面的 setter 中验证用户输入的最佳位置在哪里:
public function setSalary($salary)
{
if (Validator::money($salary))
$this->salary = $salary;
else
return 'Error that is an invalid number';
}
还是在控制器中?
public function updateSalary()
{
$errors = array();
if (Validator::money($_POST['salary']))
$salary = $_POST['salary'];
else
$errors ['salary'] = 'Error that is an invalid number';
if(count($errors))
return $errors;
$employee = new Employee($_POST['e_Id']);
$employee->setSalary($salary);
$employee->save();
}
如果我要放入 setter,我的控制器应该如何查看并返回验证错误?
我看到大多数人在控制器中进行验证,但是我认为应该由模型负责验证,因为它将使用数据,我们可以重用该模型而无需重复自己。 然而,有时验证规则可能需要在某些特殊情况下有所不同,例如针对不同视图的不同验证或针对超级管理员的不同验证。
您认为哪一项符合最佳做法?
【问题讨论】:
-
事实上,数据来自用户输入,只是一个“细节”。您应该验证的是
Employee实例处于有效状态。您可能还应该尝试捕获任何可能从持久层抛出的异常。 -
必须在控制器中验证用户的输入(例如:无效的 id - 应为整数)。业务逻辑验证应该在服务/模型中完成(例如:没有这样的用户 ID)
-
@MateiMihai 这是完全错误的。控制器不负责数据验证。您验证的业务规则将如何最终出现在那个“控制器”中?
-
@Mjh 你说的“他”是谁?和 ID 的无效性取决于它的使用方式。
Employee实例知道,ID 必须是数字,而不是“115-124-1555”。
标签: php validation oop