2015-05-24 2 views
1

У меня есть API, и я отправляю ссылку на объект, я использую DataTransformer для получения моей сущности, но DataTransformer всегда вызывается перед $form->handleRequest($request), это значение всегда null, и оно не может работаетSymfony2 DataTransformer после handleRequest

Мой контроллер

public function newAction(Request $request) 
    { 
     $orderNewFormType = $this->get('competitive_bo.api_bundle.form.type.order_new'); 
     $card = new Card(); 

     try { 
      $form = $this->createForm($orderNewFormType, $card); 
      $form->handleRequest($request); 
     } catch (TransformationFailedException $e) { 
      return $this->notFoundErrorResponse(
       'Business not found' 
      ); 
     } 

     if ($form->isValid()) { 
      return $this->okResponse(array()); 
     } 

     $validatorErrorFormatter = $this->get('competitive_bo.api_bundle.formatter.validator_error'); 
     $errors = $validatorErrorFormatter->formatFromFormError($form->getErrors(true)); 

     return $this->badRequestErrorResponse(
      'Invalid data', 
      $errors 
     ); 
    } 

Тип формы

class OrderNewFormType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('customer', 'entity', array(
       'class' => 'CompetitiveBOBusinessBundle:Customer', 
       'property' => 'id' 
      )) 
      ->add('business', 'business', array(
       'mapped' => false, 
      )) 
     ; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'csrf_protection' => false, 
      'data_class'  => Card::class 
     )); 
    } 

    public function getName() 
    { 
     return null; 
    } 
} 

Бизнес форма типа

class BusinessReferenceFormType extends AbstractType 
{ 
    /** 
    * @var ReferenceToBusinessTransformer 
    */ 
    private $referenceToBusinessTransformer; 

    public function __construct(ReferenceToBusinessTransformer $referenceToBusinessTransformer) 
    { 
     $this->referenceToBusinessTransformer = $referenceToBusinessTransformer; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->addViewTransformer($this->referenceToBusinessTransformer); 
    } 

    public function getName() 
    { 
     return 'business'; 
    } 

    public function getParent() 
    { 
     return 'text'; 
    } 
} 

И DataTransformer

/** 
* Class ReferenceToBusinessTransformer 
*/ 
class ReferenceToBusinessTransformer implements DataTransformerInterface 
{ 
    /** 
    * @var BusinessRepository 
    */ 
    private $businessRepository; 

    public function __construct(BusinessRepository $businessRepository) 
    { 

     $this->businessRepository = $businessRepository; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function transform($reference) 
    { 
     var_dump($reference); 
     $business = $this->businessRepository->findOneBy(array(
      'reference' => $reference 
     )); 

     if (null === $business) { 
      throw new TransformationFailedException; 
     } 

     return $business; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function reverseTransform($value) 
    { 
     if (!($value instanceof Business)) { 
      throw new TransformationFailedException; 
     } 

     return $value->getReference(); 
    } 
} 

var_dump($reference) всегда нуль

И у меня есть тест

public function testNewAction($getParams, $postParam, $responseCode) 
    { 
     $client = static::createClient(); 

     $router = $client->getContainer()->get('router'); 
     $route = $router->generate('competitivebo_api_order_new',$getParams); 

     $client->request('POST', $route, $postParam); 
     $response = $client->getResponse(); 

     $this->assertJsonResponse($response, $responseCode); 
    } 

С пост Params

'customer' => 1, 
'business' => LoadBusinessData::REFERENCE_1, 
'name' => 'Test', 

Исключение TransformationFailedException всегда выброшены во время $this->createForm(...) поэтому запрос не обрабатывается

ответ

2

В соответствии с documentation,

Когда нуль передается методу преобразования(), ваш трансформатор должен возвращать эквивалентное значение типа, к которому он преобразуется (например, пустая строка, 0 для целых чисел или 0.0 для поплавков).