Почему не выполняется мой пользовательский валидатор Symfony?

#php #symfony #symfony-4.2

#php #symfony #symfony-4.2

Вопрос:

У меня есть следующие классы

Объект, подлежащий проверке:

 <?php
//CompanyNameDataBundleEntityInternAddress.php

namespace CompanyNameDataBundleEntityIntern;

use CompanyNameDataBundleEntityCountry;

use SwaggerAnnotationsProperty;
use SymfonyComponentSerializerAnnotationGroups;
use SymfonyComponentValidatorConstraints as Assert;
use CompanyNameConstraintValidatorBundleConstraintValidator;
use CompanyNameConstraintValidatorBundleEntityCountryZipCodeAwareInterface;

/**
 * Class Address
 * @package CompanyNameDataBundleEntityIntern
 * @ConstraintValidatorZipCode
 */
class Address implements CountryZipCodeAwareInterface
{
    /**
     * originId for 'API' send to the Addressbridge and stored in the Addresservice
     *
     * 
     * 
     */
    const ORIGIN_ID_FOR_ADDRESS_FROM_API = 2;

    /**
     * @var integer
     */
    private $id;

    /**
     * @var Name
     * @Property(type="string")
     * @Groups({"createOrder", "shoppingCart"})
     * @AssertNotBlank()
     * @AssertValid()
     */
    private $name;

    /**
     * @var string
     * @Groups({"createOrder", "shoppingCart"})
     * @AssertNotBlank()
     * @AssertType("string")
     * @AssertLength(max = 100, maxMessage = "Street name cannot be longer than {{ limit }} characters")
     */
    private $street;

    /**
     * @var string
     * @Groups({"createOrder", "shoppingCart"})
     * @AssertNotBlank()
     * @AssertType("string")
     * @AssertRegex("/^d $/")
     * @AssertLength(max = 5, maxMessage = "House number cannot be longer than {{ limit }} characters")
     */
    private $housenumber;

    /**
     * @var string
     * @Groups({"createOrder", "shoppingCart"})
     * @AssertType("string")
     * @AssertLength(max = 25, maxMessage = "Addition cannot be longer than {{ limit }} characters")

    /**
     * @var Country
     * @Property(type="string")
     * @Groups({"createOrder", "shoppingCart"})
     * @AssertNotBlank()
     * @AssertValid()
     */
    private $country;    
}
  

Ограничение для использования в моем пользовательском валидаторе:

 <?php
//CompanyNameDataBundleValidatorName.php

namespace CompanyNameDataBundleValidator;

use SymfonyComponentValidatorConstraint;

/**
 * Class Name
 * @package CompanyNameDataBundleValidator
 * @Annotation
 */
class Name extends Constraint
{
    public $message = "No Valid Name provided";

    /**
     * {@inheritdoc}
     */
    public function getTargets()
    {
        die("gggggg");
        return self::CLASS_CONSTRAINT;
    }
}
  

Фактический валидатор:

 <?php
//CompanyNameDataBundleValidatorNameValidator.php

namespace CompanyNameDataBundleValidator;

use SymfonyComponentValidatorConstraint;
use SymfonyComponentValidatorConstraintValidator;

class NameValidator extends ConstraintValidator
{
    /**
     * Checks if the passed value is valid.
     *
     * @param Name name The value that should be validated
     * @param Constraint $constraint The constraint for the validation
     */
    public function validate($name, Constraint $constraint)
    {
        var_dump($name);
        die();

    }
}
  

AssertValid() не работает. Выдает следующую ошибку:

ExceptionListener.php в строке 17: SymfonyComponentValidatorExceptionNoSuchMetadataException {#1052
сообщение: «Класс или интерфейс «test» не существует».

Ниже приведена полезная нагрузка:

  "invoiceAddress": {
    "name": "test",
    "street": "Dorpsstraat",
    "housenumber": "123",
    "zipcode": "1234AB",
    "city": "Dorp",
    "country": "nl"
  },
  "deliveryAddress": {
    "name": "Naam",
    "street": "Dorpsstraat",
    "housenumber": "123",
    "housenumberAddition": "A",
    "zipcode": "1234AB",
    "city": "Dorp",
    "country": "nl"
  },
  

Ответ №1:

Вы используете неправильный валидатор.

Сначала импортируйте соответствующее пространство имен в определение вашего класса:

 use CompanyNameDataBundleValidator as CompanyAsserts;
  

И тогда ваши аннотации свойств должны выглядеть следующим образом:

 /**
* @var Name
* @Property(type="string")
* @Groups({"createOrder", "shoppingCart"})
* @AssertNotBlank()
* @CompanyAssertsName
*/
private $name;
  

Таким образом, вы фактически используете свой пользовательский валидатор. Удалите @AssertValid() , это не тот валидатор, который вы ищете.

Вам также необходимо обновить аннотации к ограничениям:

 /**
 * Class Name
 * @package CompanyNameDataBundleValidator
 * @Annotation
 * @Target({"PROPERTY", "METHOD", "ANNOTATION"})
 */
class Name extends Constraint {
   // your class
}
  

(Обратите внимание на @Target аннотацию). Кроме того, удалите getTargets() метод из этого класса.

Комментарии:

1. Но нет класса CompanyName DataBundle Validator?

2. Я получил следующую ошибку. The class "CompanyNameDataBundleValidatorNameValidator" is not annotated with @Annotation. Are you sure this class can be used as annotation? P.S. Я впервые пробую свои силы на Symfony.

3. пытался удалить ‘()’ из CompanyAssertsNameValidator , но безуспешно

4. The constraint CompanyNameDataBundleValidatorName cannot be put on properties or getters. :(. . Должен ли я использовать только @CompanyAssertsName ?

5. Нет, нет. Это не сработало. Он просто выдал The constraint CompanyNameDataBundleValidatorName cannot be put on properties or getters. ошибку

Ответ №2:

Вы должны использовать свое пользовательское утверждение валидатора. @AssertValid() аннотацию следует использовать, когда вы хотите проверить свойство, имеющее отношение к вашей сущности (например, когда у вас есть отношение User to Address и вы хотите провести некоторую пользовательскую проверку $address в пользовательской сущности).

Вот почему он ищет класс test для проверки. Загляните в документацию здесь