繁体   English   中英

handleRequest之后的Symfony2 DataTransformer

[英]Symfony2 DataTransformer after handleRequest

我有一个API,并且正在发送一个实体的引用,我正在使用DataTransformer来获取我的实体,但是总是在$form->handleRequest($request)之前调用DataTransformer,该值始终为null,并且可以作品

我的控制器

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)始终为null

我有测试

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);
    }

与后期参数

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

$this->createForm(...)期间始终抛出异常TransformationFailedException因此不处理请求

根据文档

当将null传递给transform()方法时,您的转换器应返回要转换为的类型的等效值(例如,空字符串,0表示整数或0.0表示浮点数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM