假设我有一个这样的实体类:
class car
{
private $price;
private $color;
public __get($name){ ... }
public __set($name, $value){ ... }
...
}
和这样的经理类:
class CarDealer
{
private $db;
public __construct(IDatabase $db) {...}
public sell(Car $car) {...}
public insert(Car $car) {...}
...
}
问题是如何验证汽车的属性?if
我可以通过检查语句在 car 类的 setter 方法中执行此操作。
但我认为,如果已经有验证服务 Symfony\Component\Validator,我应该使用它。在这里,我无法确定验证器服务的来源。
a)我可以依赖这个验证器并使用它,将它作为汽车类的构造函数的参数。但是这种注入,注入一个实体据说是个坏主意。这是真的?
b) 我可以在汽车类的构造函数中直接实例化一个验证器对象。但这一次,依赖关系将被隐藏。这也是一个不好的方法,对吧?
c)鉴于向管理器类注入一些东西很好,我可以验证管理器类中的实体。但同样,这是一个糟糕的设计,这个责任不是经理的,而是实体本身的。正确的?
验证实体的最佳或常规方法是什么?
更多解释
Validator
据我所知,以下方法隐藏了对类的依赖。所以这是一个坏的,对吧?
class car
{
private $price;
private $color;
public __get($name){ ... }
public setPrice($price} {
$validator = new Validator();
$validator->assert($price, '...some constraint...');
}
...
}
这也很糟糕,因为汽车类依赖于与其实体没有直接关系的东西,对吧?
class car
{
private $price;
private $color;
private $validator;
public __construct(Validator $validator){
$this->validator = $validator;
}
public __get($name){ ... }
....
public setPrice($price} {
$this->validator->assert($price, '...some constraint...');
}
...
}
那么,如何使用外部服务验证价格?