2016-02-11 3 views
1

Поэтому у меня есть контроллер с помощью этого метода действия здесь:реорганизовывать данные обычного запроса разбора с использованием Symfony формы компонента

public function addAction(Request $request) 
{ 
    $tournamentId = $request->request->get('tournament_id'); 
    $externalId = $request->request->get('external_id'); 
    $eventDate = $request->request->get('event_date'); 

    if (!is_numeric($tournamentId) || !is_numeric($externalId) || empty($eventDate)) { 
     throw new InvalidArgumentException('Invalid POST data'); 
    } 

    $em = $this->getDoctrine()->getManager(); 
    $tournament = $em->getRepository('BakingBankCoreBundle:TournamentGame')->find($tournamentId); 

    if (empty($tournament)) { 
     throw new InvalidArgumentException('Invalid tournament ID'); 
    } 

    $entity = new TournamentInstance(); 
    $entity->setTournament($tournament); 
    $entity->setExternalId($externalId); 
    $entity->setEventDate(new DateTime($eventDate)); 

    $em->persist($entity); 
    $em->flush(); 

    return new JsonResponse(['id' => $entity->getId()]); 
} 

Моего коллега хочет, чтобы я реорганизовать это использовать форму. Улов - поля TournamentInstance заключаются в следующем:

/** 
* @var TournamentGame 
* 
* @ORM\ManyToOne(targetEntity="TournamentGame") 
* @ORM\JoinColumn(name="tournament_id", referencedColumnName="id", onDelete="CASCADE", nullable=false) 
*/ 
private $tournament; 

/** 
* @var string 
* 
* @ORM\Column(name="external_id", type="string", length=64, nullable=false) 
*/ 
private $externalId; 

/** 
* @var DateTime 
* 
* @ORM\Column(name="event_date", type="date", nullable=false) 
*/ 
private $eventDate; 

POST-данные не передаются из формы ветку, а скорее из запроса AJAX в JS, где данные, собранные с нескольких позиций в коде.

Как я могу это сделать, и это даже стоит того? Я понимаю, что он хочет, чтобы все было стандартизованным, но я думаю, что он еще более идеалист, чем я (и это много говорит).

+0

, какая версия Symfony вы используете? – Heah

+0

@Heah - 2.7, но планируем переместить этот проект на 3.0. – jurchiks

ответ

1

Не нужен слишком много работы, как вам просто нужно сопоставить свойство сущностей с образованием полей:

use Symfony\Bridge\Doctrine\Form\Type\EntityType; 
use Symfony\Component\Form\Extension\Core\Type\DateTimeType; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 

public function addAction(Request $request) 
{ 
    $entity = new TournamentInstance(); 

    // you can set default value with $entity->setEventDate(new DateTime('tomorrow')) 
    // before passing it as data to the form builder 

    $form = $this->createFormBuilder($entity) // set the default value 
     // you need to add a field for each property accordingly to its name 
     ->add('tournament', EntityType::class) // will output a select with all tournaments 
     ->add('external_id', TextType::class) 
     ->add('external_date', DateTimeType::class) 

    $form->handleRequest($request) // will synchronize post values to the new entity 

    if ($form->isSubmitted() && $form->isValid()) { // validate the form 
     $em = $this->getDoctrine()->getManager(); 

     $filledEntity = $form->getData(); 

     $em->persist($filledEntity); 
     $em->flush(); 

     return new JsonResponse(['id' => $filledEntity->getId()]); 
    } 

    if (0 < count($form->getErrors)) { 
     return new JsonResponse(['errors' => $form->getErrors()]); 
    } 

    return new JsonResponse(['errors' => ['No data matching form type']]); 
} 

Если вам нужно точно выверенной проверку вы можете использовать ограничение в виде аннотаций свойств класса.

http://symfony.com/doc/current/book/forms.html см

и http://symfony.com/doc/current/book/forms.html#form-validation

+0

Я не использую HTML-форму для заполнения данных. Нет выбора со всеми турнирами, только идентификатор в JavaScript. Во всяком случае, я обнаружил, что Data Transformers должен быть способ пойти, но я внимательно следил за официальным руководством, но он продолжает давать мне ошибки. – jurchiks

+0

Хорошо, он работает так же, кроме возвратов. Я обновил свой ответ соответственно, надеюсь, что это помогло. – Heah

+0

Моя проблема заключалась в том, что независимо от того, что я пробовал, форма не получалась с предоставленными мной данными. Либо были ошибки типа, либо форма просто не имела ошибок и не отправляла. Но в любом случае я отказался от этой идеи, потому что было слишком много головной боли и времени, потраченного на ее решение, когда у меня уже есть рабочий код без формы. Использование формы приводит к загрузке кода раздувания в любом случае, потому что я должен использовать трансформатор данных для свойства турнира. – jurchiks

Смежные вопросы