既不是属性...也不是其中一种方法

时间:2020-06-25 18:53:12

标签: symfony doctrine-orm twig

两个具有一对一关系的实体 第一个是桌子 第二个是视图

核仁

/**
 * Nuclei
 *
 * @ORM\Table(name="datinuclei")
 * @ORM\Entity(repositoryClass="App\Repository\NucleiRepository")
 */
class Nuclei
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\GeneratedValue(strategy="NONE")
     */
    private $id;

    /**
     * @var NucleiStatistiche
     *
     * @ORM\OneToOne(targetEntity="NucleiStatistiche", fetch="EAGER")
     * @ORM\JoinColumn(name="id", referencedColumnName="id", nullable=false)
     */
    private $statistiche;

NucleiStatistiche

/**
 * NucleiStatistiche
 *
 * @ORM\Table(name="nuclei_001")
 * @ORM\Entity()
 */
class NucleiStatistiche
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\GeneratedValue(strategy="NONE")
     */
    private $id;


    /**
     * @var string
     *
     * @ORM\Column(name="totale_conferimenti", type="integer", nullable=false)
     */
    private $totale_conferimenti;

    /**
     * @var string
     *
     * @ORM\Column(name="totale_indifferenziata", type="integer", nullable=false)
     */
    private $totale_indifferenziata;

    /**
     * @var string
     *
     * @ORM\Column(name="percentuale_indifferenziata", type="integer", nullable=false)
     */
    private $percentuale_indifferenziata;


    public function getTotaleConferimenti(): ?string
    {
        return $this->totale_conferimenti;
    }

    public function getTotaleIndifferenziata(): ?string
    {
        return $this->totale_indifferenziata;
    }

    public function getPercentualeIndifferenziata(): ?string
    {
        return $this->percentuale_indifferenziata;
    }

使用

在控制器上对其进行测试
$this->getDoctrine()->getRepository(Nuclei::class)->findBy(
        array('comune' => $this->id_comune, 'id' => '14523')
    );

{% for nucleo in nuclei %}
    {{ dump(nucleo.statistiche) }}
{% endfor %}

App\Entity\NucleiStatistiche {#925 ▼
  -id: 14523
  -totale_conferimenti: 107
  -totale_indifferenziata: 2
  -percentuale_indifferenziata: 2
}

我可以使用转储查看值,但是当在树枝中引用属性时,我会报错

{% for nucleo in nuclei %}
    {{ dump(nucleo.statistiche.totale_conferimenti) }}
{% endfor %}

属性totale_conferimenti和方法totale_conferimenti()都不是, 存在gettotale_conferimenti() / istotale_conferimenti() / hastotale_conferimenti()__call() 并在App\Entity\NucleiStatistiche类中具有公共访问权限。

我不知道解决方案是什么...疯了!!!

1 个答案:

答案 0 :(得分:3)

公理:一切都很难,除非您了解它。

我们的首要需求是了解其工作原理。在PHP中,git fetch origin git checkout <branch> git rebase origin/master / private表示它们将在对象范围之外不可用。 Twig尝试从对象范围之外访问它们,这会导致问题。

换句话说:您的Twig尝试使用的功能不可用。

但是,我敢肯定,您已经看过Twig似乎在使用protected / private成员,因此您的经验证据似乎与我概述的理论相矛盾。但是只是表面上。您了解了问题所在,但是目前您还不了解如何使用这些关键字。

documentation对此很清楚,当它解释说使用foo.bar时,如果bar不是foo的成员,那么它最终将检查getter foo.getBar()。因此,您将需要实现protected并对其成员进行类似的操作。我有一段时间没有使用Twig了,但是如果记忆很好,getStatistiche就需要totale_conferimenti

编辑(Jakumi的有用评论):

您大约占90%。 Symfony通常采用驼峰式大小写,在这种情况下,您假定的吸气剂名称将是正确的。错误消息指出了预期的吸气剂名称。还有其他方便的信息:转储的输出在每个私有/不可访问的资产前都有-,在每个公共财产前都有+。但是,该诊断是100%正确的,缺少“无法访问的”属性的吸气剂,并且没有可能的回退。

相关问题