#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
для проверки. Загляните в документацию здесь