Forms Symfony表单自定义约束计算失败,原因是存储库中出现意外的实体更改时间
在Symfony 3.3.17应用程序中,我有一个使用自定义验证约束的带有参数的实体Forms Symfony表单自定义约束计算失败,原因是存储库中出现意外的实体更改时间,forms,symfony,constraints,symfony-3.3,symfony3.x,Forms,Symfony,Constraints,Symfony 3.3,Symfony3.x,在Symfony 3.3.17应用程序中,我有一个使用自定义验证约束的带有参数的实体 class JobAd { ... /** * @ORM\Column(type="string", length=2048) * @JobAdAssert\JobAdUrlExists */ protected $url = ''; ... } JobAdUrlExists的约束如下所示 /** * @Annotation */ clas
class JobAd
{
...
/**
* @ORM\Column(type="string", length=2048)
* @JobAdAssert\JobAdUrlExists
*/
protected $url = '';
...
}
JobAdUrlExists的约束如下所示
/**
* @Annotation
*/
class JobAdUrlExists extends Constraint
{
public $message = 'Cant use URL "{{ string }}". Its in use already.';
public function validatedBy()
{
return 'job_add_url_exists.validator';
}
}
// ...
$jobAd = $jobAdRepository->findOneBy( array( 'url' => $job_ad_url ) );
$jobAdForm = $this->createForm( JobAdType::class, $jobAd );
if('POST' === $request->getMethod()) {
if( $request->request->has( 'job_ad' ) ) {
$jobAdForm->handleRequest($request);
if( $jobAdForm->isSubmitted() && $jobAdForm->isValid() ) {
// ...
$em->persist( $jobAd );
$em->flush();
}
}
}
return $this->render( $jobAdTemplate, array(
'form_job_ad' => $jobAdForm->createView(),
));
{{ form_start(form_job_ad) }}
{{ form_errors(form_job_ad) }}
{{ form_widget(form_job_ad.url) }}
{{ form_end(form_job_ad) }}
这是JobAdUrlExistsValidator
class JobAdUrlExistsValidator extends ConstraintValidator
{
// ...
public function validate( $value, Constraint $constraint )
{
// ...
if( /* logic here */ ) {
$this->context->buildViolation( $constraint->message )
->setParameter( '{{ string }}', $value )
->addViolation();
}
}
}
表单类型定义为
class JobAdType extends AbstractType implements ContainerAwareInterface
{
use ContainerAwareTrait;
public function buildForm( FormBuilderInterface $builder, array $options )
{
// ...
$builder->add( 'url', TextType::class, array(
'label' => $translator->trans( 'URL' ),
'required' => false,
'translation_domain' => 'messages',
'mapped' => true,
'data' => $url
));
// add other form fields ...
}
public function configureOptions( OptionsResolver $resolver )
{
$resolver->setDefaults(
array(
'data_class' => 'AppBundle\Entity\JobAd',
)
);
}
public function getBlockPrefix()
{
return 'job_ad';
}
}
我的应用程序逻辑创建了这样一个视图
/**
* @Annotation
*/
class JobAdUrlExists extends Constraint
{
public $message = 'Cant use URL "{{ string }}". Its in use already.';
public function validatedBy()
{
return 'job_add_url_exists.validator';
}
}
// ...
$jobAd = $jobAdRepository->findOneBy( array( 'url' => $job_ad_url ) );
$jobAdForm = $this->createForm( JobAdType::class, $jobAd );
if('POST' === $request->getMethod()) {
if( $request->request->has( 'job_ad' ) ) {
$jobAdForm->handleRequest($request);
if( $jobAdForm->isSubmitted() && $jobAdForm->isValid() ) {
// ...
$em->persist( $jobAd );
$em->flush();
}
}
}
return $this->render( $jobAdTemplate, array(
'form_job_ad' => $jobAdForm->createView(),
));
{{ form_start(form_job_ad) }}
{{ form_errors(form_job_ad) }}
{{ form_widget(form_job_ad.url) }}
{{ form_end(form_job_ad) }}
最后,twig视图输出如下形式
/**
* @Annotation
*/
class JobAdUrlExists extends Constraint
{
public $message = 'Cant use URL "{{ string }}". Its in use already.';
public function validatedBy()
{
return 'job_add_url_exists.validator';
}
}
// ...
$jobAd = $jobAdRepository->findOneBy( array( 'url' => $job_ad_url ) );
$jobAdForm = $this->createForm( JobAdType::class, $jobAd );
if('POST' === $request->getMethod()) {
if( $request->request->has( 'job_ad' ) ) {
$jobAdForm->handleRequest($request);
if( $jobAdForm->isSubmitted() && $jobAdForm->isValid() ) {
// ...
$em->persist( $jobAd );
$em->flush();
}
}
}
return $this->render( $jobAdTemplate, array(
'form_job_ad' => $jobAdForm->createView(),
));
{{ form_start(form_job_ad) }}
{{ form_errors(form_job_ad) }}
{{ form_widget(form_job_ad.url) }}
{{ form_end(form_job_ad) }}
现在-当我在表单字段中插入一个引发验证错误的URL时,会发生三件事,这让我非常困惑:
任何提示都是非常受欢迎的:-)在你的课堂作业中,你需要在你的
$信息中转义。
(可能与你的主要问题无关,但可能有问题)@v-gael y-谢谢。正确:-)但这对实际问题没有帮助(如您所说)。