Symfony 4 формы, пользовательские DTO и отношения сущностей - PullRequest
0 голосов
/ 21 июня 2019

Был создан API, позволяющий создавать сообщения с описанием и любым количеством прикрепленных фотографий.

Проблема заключалась в том, что при получении запроса API на редактирование сообщения с нулевым описанием была напечатана подсказкапотерпит неудачу.

 class Post {

 /**
  * @Assert\NotBlank 
  * @ORM\Column(type="text")
  */
 private $description;

 /**
  * @ORM\ManyToMany(targetEntity="App\Entity\Photo")
  */
 private $photos;

 public function setDescription(string $descripton)

Что означает, что вместо проверки Symfony при сбое Assert \ NotBlank он возвращал 500.

Это можно было исправить, разрешив пустые значения в методе? string, thisбудет позволять вызывать проверку, но в результате получится грязная сущность.

Подход DTO (Data Transfer Object), новый класс для представления данных был создан и правила проверки, примененные к этому, былидобавлен в форму.

class PostData {

 /**
  * @Assert\NotBlank 
  */
 public $description;

 /**
  * @Assert\Valid
  * @var Photo[]
  */
 public $photos;

Форма была изменена:

class PostType extends AbstractType {

public function buildForm(FormBuilderInterface $builder, array $options)
    $builder
        ->add('description')
        ->add('photos', EntityType::class, [
        'class' => Photo::class,
        'multiple' => true,
    ]);
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => PostData::class,
    ));
}

Это работает для описания, его можно проверить без изменения сущности Post.Если было получено нулевое значение, PostData вызовет Assert \ NotBlank и Post :: setDescription не будет вызываться с нулевым значением.

Проблема возникла при попытке проверить, существуют ли фотографии, если фотография существует, она будет работать, если она будет работатьне было бы ошибки 500.

Потенциально бессмысленная ошибка 500, которая не указывает причину

Checking only for cacheable HTTP methods with Symfony\Component\HttpFoundation\Request::isMethodSafe() is not supported. (500 Internal Server Error)

Как я могу использовать DTO PostData для проверки существования сущности Photo?

1 Ответ

0 голосов
/ 24 июня 2019

Обновите composer.json и запустите обновление композитора

       "symfony/http-foundation": "4.4.*",

Проблема связана с https://github.com/symfony/symfony/issues/27339

Это даст более значительную ошибку формы Symfony

Unable to reverse value for property path \"photos\": Could not find all matching choices for the given values

Он также вернет много дополнительной информации, если вы укажете ошибки формы, включая DATABASE_URL и APP_SECRET.

Я не рекомендую запускать это в производстве.

...