【问题标题】:validation in entity classes实体类中的验证
【发布时间】:2013-09-25 10:42:47
【问题描述】:

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

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 语句在汽车类的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...');
  }
  ...
}

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

【问题讨论】:

    标签: php oop validation


    【解决方案1】:

    考虑使用简单的访问器 (getPrice/setPrice) 而不是魔法,然后您可以直接在 setter 中验证值。

    a - 不是,但在实体的情况下并不总是很方便。
    b - 是的,构造函数中的任何逻辑都是一个坏主意。
    c - 是的,类的“经理”名称已经是一个不好的迹象(更多信息:12),并且您的类将很快被所有实体验证炸毁。

    【讨论】:

    • 确实,在 getPrice() 方法中,我可以验证任何给定的价格。但是怎么做?如果我选择通过诸如“if price>X and x
    • 更好 - 使用依赖注入。
    猜你喜欢
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    相关资源
    最近更新 更多