从表单类型/抽象类手动SQL查询

时间:2016-05-06 03:20:50

标签: symfony-forms symfony

首先,我将从Symfony 1.4转移到Symfony 3.(是的,我最初在踢和尖叫)

我的问题:我正在运行一个来自以下FormType类的手动查询,该类用于我的注册表单的一大块。我正在将注册的地址部分移动到自己的类中。我正在调用一个地理表来获取我的状态列表,并且我有一个联盟......因此这就是为什么我没有调用实体类。

问题是我需要连接到数据库但不能,因为它是一个Abstract类。如果我在Controller类中运行这个,没问题,但是在这个Abstract类中不能这样做。在进行任何插入之前,我有一堆手动步骤,所以我可以

你如何做以下工作?我没有创建任何服务,但如果我将所有这些都放入控制器类中,那么它可以正常工作。

<?php

namespace LocationBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Doctrine\ORM\EntityManager;


class PartialAddressType extends AbstractType
{
    private function getStatesList()
    {
        $sql = "
                SELECT
                 '0' AS id  
                 ,'' AS name
                 ,'' AS abbreviation
                 ,'Select State' AS display
                UNION
                SELECT
                  id
                 ,trim(name)
                 ,trim(abbreviation)
                 ,CONCAT(trim(abbreviation), ' - ', trim(name)) AS display
                FROM
                  geo_state
                WHERE
                  type = 'state'
                ORDER BY abbreviation ASC; ";

        $manager = $this->getDoctrine()->getManager('default');
        $conn = $manager->getConnection();
        $rs = $conn->query($sql)->fetchAll();

        return $rs;
    }


    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $rs = $this->getStatesList();


        //  This one is for a Select
        $builder->add('locationState', ChoiceType::class, array(
                'expanded'          => FALSE,
                'multiple'          => FALSE,
                'choices'           => $rs(),
                'choice_label'      => $rs['display'],
                'choice_attribute'  => $rs['abbreviation'],
                'preferred_choices' => array('TX'),
                'choices_as_values' => FALSE,
                'label'             => 'State',
            )
        );
   }


    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array());
    }

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

1 个答案:

答案 0 :(得分:0)

我建议您按照以下步骤操作:

1)将查询移到单独的存储库类中(我希望您将表映射为实体)

2)将自定义查询的EntityType字段用作described here

3)使用placeholder

避免使用UNION

最后提示,您应该按照迁移指南here中的说明实施getBlockPrefix方法,而不是getName

希望这个帮助