Проверка формы с помощью отношения внешнего ключа

#symfony #symfony-forms #symfony-validator

#symfony #symfony-forms #symfony-валидатор

Вопрос:

Моя схема базы данных выглядит примерно так:

 create table users (
  id INT PRIMARY KEY,
  username TEXT,
)

create table posts (
  id INT PRIMARY KEY,
  user_id INT,
  title TEXT,
  content TEXT,
)
  

я разрабатываю API для создания «сообщений», поэтому я публикую, как показано ниже, и отношение было определено в сущности User и Posts

 {
   "user": {
        "username": "some_name"
   },
   "title": "testing",
   "content": "test content"
}
  

и мне нужно проверить, отправлено ли правильное имя пользователя?. Как я мог это сделать?

Мой контроллер, подобный этому

 $post = new Post();
$form = $this->createForm(PostType::class, $post);
$form->submit($request->request->all());
  

Моя форма конструктора выглядит следующим образом

 $builder
    ->add('title', TextType::class)
    ->add('content', TextType::class)
    ->add('User', UserType::class, array(
        'data_class' => User::class
    ));
  

Но он пытается создать пользователя каждый раз, вместо того, чтобы проверять, передано ли действительное имя пользователя. Есть идеи?

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

1. вы хотите проверить, существует ли пользователь, прежде чем сохранять данные (post)?

2. @MohammedYassineCHABLI я хочу проверить, опубликовано ли действительное имя пользователя, если это так, сохраняйте данные в таблице «posts» с соответствующим идентификатором пользователя, иначе появится какая-то ошибка

3. что вы подразумеваете под допустимым именем пользователя? вы имеете в виду, существует ли пользователь без таблицы user, не так ли?

4. да @MohammedYassineCHABLI

Ответ №1:

Предположим, что ваша пользовательская сущность с именем User внутри пакета с именем App, свойство с именем username в сущности User в вашем контроллере :

 $user = $em->getRepository('AppBundle:User')->findBy(array('username' => $username)); // we suppose that you have already extract the value of username from the request into $username. 
  

И тогда вы можете просто проверить :

 if($user instanceof User){
// do whatever you need here 
}
  

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

1. Возможно ли это сделать в конструкторе форм ` $builder -> add(‘title’, TextType::class) ->add(‘content’, TextType::class) ->add(‘User’, UserType::class, array( ‘data_class’ => User::class ));’ вместо контроллера

2. вы хотите добавить это в свой конструктор форм?

3. да, отношение уже определено внутри объекта, поэтому через конструктор форм мне нужно добавить

4. вы можете передать значение через $options конструктора форм

5. CreateForm(string $type, mixed $data = null, array $options = array()) // третий параметр