【问题标题】:Is there any way to inject validation constraints in symfony有没有办法在 symfony 中注入验证约束
【发布时间】:2014-01-06 09:03:09
【问题描述】:

我想验证我自己的包中的几个参数。注入验证器服务很容易,但似乎我仍然必须“使用”约束类。

有没有办法避免硬编码约束依赖?

【问题讨论】:

  • 什么意思?您能否向我们展示与该问题相关的代码?您的预期行为是什么?
  • 你能举个例子说明你想要达到的目标吗?
  • 假设 $validator 是我们注入的验证器。然后验证价值我需要做这样的事情: $validator->validateValue('Moo', new Email());其中 Email 是 'Symfony\Component\Validator\Constraints\' 名称路径中的类。但要这样做,我将不得不将确切的名称路径硬编码到我的服务中,从而不仅将其耦合到框架,而且实际在当前版本中实现。
  • 是的,你的应用程序对Validator 组件有一个依赖,这似乎不是问题。如果你不想“硬编码”类名,你可能想创建一个Acme\Validator\Validation\EmailInterface,任何电子邮件验证器都应该实现它以便与你的应用程序一起工作。但同样,我不明白你为什么需要这个。
  • 因为我真的不依赖特定的验证器。我的代码基本上接受任何具有 validateValue 方法的验证器。路径硬编码是不一样的——因为如果,例如 Symfony 将决定将一些验证器移动到另一个命名空间(这已经发生)——我的代码将会中断。

标签: validation symfony dependency-injection constraints


【解决方案1】:

当然。将约束定义为服务。

$emailConstraint = $this->get('my_email_constraint');
$this->validator->validateValue('Moo', $emailConstraint); 

所以现在如果您决定使用新的超级骗子电子邮件验证器,您需要做的就是更新您的服务文件。

【讨论】:

  • 这不是“我的约束”。这是 symfony 内置的。
  • ???使用服务将您的客户端代码与确切知道正在使用的约束类隔离开来,因此避免了硬编码依赖项的需要。考虑用一个你希望事情如何运作的例子来更新你的问题。
  • 您是否建议我需要为我想使用的每个 symfony 约束编写服务?检查 cmets 的问题 - 那里有一个小例子。
  • 这正是我的建议。不难。只需将它们藏在自己的服务文件中即可。如果需要,您甚至可以为类名使用参数,这意味着每个应用程序都可以根据需要进行覆盖。请记住,要求是验证“少数参数”,因此不应该有那么多。
  • 如果我决定采用“编写自己的服务”的方式,我宁愿编写工厂服务来获得我可能需要的任何约束,而不是为每个服务编写服务。我想知道是否已经有内置的方法可以做到这一点(我错过了)。好像没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多