将数据从实体表单传递给控制器​​Symfony3

时间:2017-01-08 13:23:49

标签: symfony

我有实体类型类字段(下拉列表),它从我的一个表生成数据。我有表单子代理,用户将为该特定子代理选择公司。

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

    $builder->add('company_id', EntityType::class, array(
        'label' => 'Company',
        'required' => true,
        'class' => 'OnlyBundle\Entity\Company',
        'choice_label' => 'name', // The Company Name
        'choice_value' => 'id', // The Company ID (unique) to be inserted in DB
        'expanded' => false,
        'multiple' => false,
        'placeholder' => 'Choose a Company',
        'constraints' => array(
            new NotBlank(array("message" => 'Company name is required.')),
        ),            
    ));  

此实体将生成如下所示的树枝。

    <select id="sub_agent_company_id" name="sub_agent[company_id]" required="required">
    <option value="" selected="selected">Choose a Company</option>
    <option value="20">ABC</option>
    <option value="21">EFG</option>
<option value="22">HIJ</option>
    </select>

我想将下拉字段(20,21,22)的值传递或设置到我的控制器中,但问题是,下拉列表会从公司类中返回一个对象。如何仅传递下拉列表的值,而不是整个控制器?

这是我的控制者。

   public function createAction(Request $request) {

        $sub_agent = new Sub_agent;

        $form = $this->createForm(SubAgentType::class, $sub_agent, array(
            'action'=>$this->generateUrl('swipe_backend_sub_agent_create'),
            'method'=>'POST'
        ));

        $form->handleRequest($request);

         if ('POST' === $request->getMethod()) {

            $data = $form->getData();

            $sub_agent_name = $data->getName();

            var_dump($data->getCompanyId()); exit;

..../

2 个答案:

答案 0 :(得分:0)

$data->getCompanyId()返回公司对象。如果您只想获取其ID而不是整个对象,请调用$data->getCompanyId()->getId()

答案 1 :(得分:0)

您可以直接从以下表单中获取公司的id控制器:

$id = $sub_agent->getId();

...假设您的Sub_agent实体类

中有一个getter
public function getId(){
    return $this->id;
}

但你在这里错过了重点。当你使用Doctrine时,忘记&#34; SQL的方式&#34;,而是将整个问题视为对象。

只需删除if ('POST' === $request->getMethod()),然后添加:

if ($form->isSubmitted() && $form->isValid()) {
...
}

检查表单是否已提交,以及是否有效,根据您的约束,在Sub_agent实体中设置,如果有的话。

在那张支票中,我已经告诉你要添加,只需转储$sub_agent变量以查看其中的内容。不要忘记第一件事:在模板中你有相应的表格,添加你想要的一些数据,然后提交那个表格,然后从控制器检查转储。

//...
if ($form->isSubmitted() && $form->isValid()) {
    dump($sub_agent); die;
}

所以重点是你不必担心,或者尝试从表单中获取每个字段,然后将它们映射到实体的属性,以便能够保存数据库中的表单数据。学说已经为你做了。您需要做的就是设置实体(属性+ getter和setter),基于该实体创建表单,然后添加我告诉您的代码。那就是它!够容易吗?