gpt4 book ai didi

php - 如何让 Symfony 回调验证器 Doctrine 感知?

转载 作者:行者123 更新时间:2023-12-02 19:37:17 24 4
gpt4 key购买 nike

正如标题中所说,我实际上需要使用 Symfony 创建一个验证过程。我正在使用 YAML 文件,一切正常。但在某些情况下,我需要在说数据经过验证之前检查数据库。我在 Callback 中搜索方法,但它实际上只允许我基本上检查这些值。我搜索过进行依赖注入(inject),甚至将定义的服务作为回调传递,但这也没有帮助。

简而言之,问题是:有可能实现吗?通过什么方式?

最佳答案

根据@dragoste 在评论中所说的内容,我搜索了如何在自己的约束下实现它。

解决方案是使用 Custom Constraint 。知道要创建什么文件以及要做什么有点困惑,所以这就是我所做的。

为了向您解释我的文件是什么,目标是验证租金,而不是通过租金的方式来验证,而只是检查同时没有租金。这就是为什么我必须使用其中包含 Doctrine 的约束。

在包的根目录中创建 Validator 文件夹。然后,在 Validator 文件夹中添加一个 Constraints 文件夹。

Validaor/Constraints 文件夹中创建文件 RentDatesConstraint.php。其外观如下:

<?php

namespace ApiBundle\Validator\Constraints;

use ApiBundle\Validator\RentDatesValidator;
use Symfony\Component\Validator\Constraint;

class RentDatesConstraint extends Constraint
{
public $message = 'The beginning and ending date of the rent are not available for this vehicle.'; // note that you could use parameters inside it, by naming it with % to surround it

/**
* @inheritdoc
*/
public function validatedBy()
{
return RentDatesValidator::class; // this is the name of the class that will be triggered when you need to validate this constraint
}

/**
* @inheritdoc
*/
public function getTargets()
{
return self::CLASS_CONSTRAINT; // says that this constraints is a class constraint
}
}

现在您已经创建了自己的类约束,您必须创建自己的验证器。

Validator文件夹中创建文件RentDatesValidator.php

<?php

namespace ApiBundle\Validator;

use Doctrine\Bundle\DoctrineBundle\Registry;
use Doctrine\Common\Collections\Collection;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class RentDatesValidator extends ConstraintValidator
{
/**
* @var Registry $doctrine
*/
private $doctrine;

/**
* RentDatesValidator constructor.
* @param Registry $_doctrine
*/
public function __construct(Registry $_doctrine)
{
$this
->setDoctrine($_doctrine)
;
}

/**
* @param Registry $_doctrine
* @return $this
*/
public function setDoctrine(Registry $_doctrine)
{
$this->doctrine = $_doctrine;
return $this;
}

/**
* @inheritdoc
* @param Rent $_value
*/
public function validate($_value, Constraint $_constraint)
{
//do your stuff here

if ($testFails) {
$this
->context
->buildViolation($_constraint->message) // here you can pass an array to set the parameters of the string, surrounded by %
->addViolation()
;
}
}
}

我们快完成了,我们必须将其声明为服务,因此我们在这里编辑Resources/config中的services.yml

services:
# [...]
validator.rent_dates:
class: ApiBundle\Validator\RentDatesValidator
tags:
- { name: validator.constraint_validator }
arguments: [ "@doctrine" ]

你可以注意到这里我传递了@doctrine服务,但实际上你可以传递任何你想要的服务,甚至很多,只要你定义RentDatesValidator类在其构造函数中正确接受这些服务。

现在,您所要做的就是在验证中使用它。在这里,我们在 Resource/config/validation 中编辑 Rent.yml 以仅添加这一行:

ApiBundle\Entity\Rent:
constraints:
- ApiBundle\Validator\Constraints\RentDatesConstraint: ~

我们完成了!将您的对象传递给验证器服务时,验证将起作用。

您可以注意到这是用 YAML 制作的,我个人更喜欢这种做事方式,因为它将每个部分(实体定义、数据库模式、验证文件...)分开,但您可以使用注释、XML 来完成甚至是纯 PHP。这取决于您,因此如果您想了解更多语法,您仍然可以访问 Symfony 文档的链接来了解如何执行此操作。

关于php - 如何让 Symfony 回调验证器 Doctrine 感知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39866744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com