首先,我将从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';
}
}
答案 0 :(得分:0)
我建议您按照以下步骤操作:
1)将查询移到单独的存储库类中(我希望您将表映射为实体)
2)将自定义查询的EntityType字段用作described here
3)使用placeholder
避免使用UNION最后提示,您应该按照迁移指南here中的说明实施getBlockPrefix
方法,而不是getName
。
希望这个帮助