实体类中的验证


validation in entity classes

假设我有一个这样的实体类:

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( 我可以直接在 car 类的构造函数中实例化一个验证器对象。但这一次,依赖将被隐藏。 这也是一个糟糕的方法,对吧?

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...');
  }
  ...
}

那么,如何使用外部服务验证价格?

考虑使用简单的访问器(getPrice/setPrice(而不是magic ,然后你可以直接在setters中验证值。

a - 不是,但在实体的情况下并不总是很方便。
b - 是的,构造函数中的任何逻辑都是一个坏主意。
C - 是的,类的"管理器"名称已经是一个坏兆头(更多关于它的信息:1、2(,你的类很快就会被实体的所有验证炸毁。