属性在模板中不存在,尽管它已分配

Posted

技术标签:

【中文标题】属性在模板中不存在,尽管它已分配【英文标题】:Property does not exists in template although its assigned 【发布时间】:2022-01-15 17:37:05 【问题描述】:

我正在开发一个 Symfony 应用程序来将仪表值添加到仪表。一个仪表可以有一组测量值,对于每个测量值,我想显示一个值表单来输入值。

为此,我在控制器中有一个函数,它根据相应的测量值创建新元素的ArrayCollection,如下所示:

/**
 * @Route("/id/add", name="metervalue_add", methods="GET","POST")
 */
public function add(Request $request, Meter $meter): Response

    $metervalues = new ArrayCollection();
    $measurements = $meter->getMeasurements();
    // create an empty metervalue for each measurement of the meter
    foreach ($measurements as $measurement) 
        $mv = new MeterValue();
        $mv->setMeter($meter);
        $mv->setMeasurement($measurement);
        $metervalues->add($mv);
    
    $form = $this->createForm(MeterValueAddType::class, ['metervalues' => $metervalues]);

    $form->handleRequest($request);

    // ... form submitting stuff
    // ...

    return $this->renderForm('metervalue/add.html.twig', [
        'form' => $form
    ]);

对应的 MeterValueAddType 看起来像

class MeterValueAddType extends AbstractType

    public function buildForm(FormBuilderInterface $builder, array $options): void
    
        $builder
            ->add('metervalues', CollectionType::class, [
                'entry_type' => MeterValueType::class
            ]);
    

    public function configureOptions(OptionsResolver $resolver): void
    
        $resolver->setDefaults([
            'data_class' => null,
        ]);
    

当我渲染表单一切正常时,空对象按预期渲染,我可以提交表单并且所有数据都正确插入到数据库中,包括测量和仪表 ID。

但是,在我的模板中,我无法访问 metervalue 对象的属性,例如 metervalues.measurementmetervalue.meter

% for metervalue in form.metervalues %
    form_widget(metervalue.value) 
    form_widget(metervalue.date) 

   Name of measurement:  metervalue.measurement.name  <-- this throws the following error
% endfor %

错误:既不是“测量”属性也不是其中一种方法 “测量()”, “getmeasurement()”/“ismeasurement()”/“hasmeasurement()”或“__call()” 在课堂上存在并具有公共访问权限 "Symfony\Component\Form\FormView"。

我不明白为什么我不能访问这里的属性只是为了显示它们,因为它们是在控制器中分配的,并在保存时正确存储在数据库中...

存在属性“measurement”和相应的“getmeasurement()”,例如如果我在列表中显示所有保存的对象,我可以访问这些

【问题讨论】:

代码试图访问measurement 作为表单类型的一部分,而不是底层数据对象。您应该可以通过metervalue.vars.data.name 或类似的方式找到它,我是凭记忆说的,所以它可能不完全准确。简而言之,尝试dumping form.vars 并从那里开始。 【参考方案1】:

msg 的提示为我指明了正确的方向。不得不使用

 metervalue.vars.data.meter.name 

让它工作!谢谢

【讨论】:

以上是关于属性在模板中不存在,尽管它已分配的主要内容,如果未能解决你的问题,请参考以下文章

如果地图中不存在属性,如何使用 strsubsitutor 将模板字符串中的值替换为 null 或空字符串

如果 itemsource 中不存在值,则组合框分配 null

Vetur 说,在模板上使用道具时,“从不”类型中不存在道具

名称模板选择器在名称空间中不存在

php随机生成数据库中不存在、不重复数字

如果 VTL / API 网关模板中不存在密钥,则返回 null