Php 在Symfony/条令中访问相关值的问题

Php 在Symfony/条令中访问相关值的问题,php,doctrine-orm,doctrine,symfony,Php,Doctrine Orm,Doctrine,Symfony,我有一个状态表,用作其他表中标识/标记状态的参考,例如: | id | status | |-------|------------| | 1 | Active | | 2 | Disabled | | 3 | Admin Only | | 4 | Archived | 我试图在Users实体的isEnabled()函数中使用这些值 public function isEnabled() { $statusObj = $

我有一个状态表,用作其他表中标识/标记状态的参考,例如:

|  id   |   status   |
|-------|------------|
|  1    | Active     |
|  2    | Disabled   |
|  3    | Admin Only |
|  4    | Archived   |
我试图在Users实体的isEnabled()函数中使用这些值

 public function isEnabled() {

    $statusObj = $this->status;
    $statusValue = $statusObj->getStatus();

    if( $statusValue  != "Active" ){
        return false;
    }

    // Simply persisting true works
     return true;
}
如果该函数当前正在登录,则会出现非对象错误

错误:对非对象调用成员函数getStatus()

查看debug,$status似乎是一个代理对象,而不是我的status对象,但似乎找不到任何东西可以为我指明正确的方向

User.orm.yml

AppBundle\Entity\User:
type: entity
table: user
indexes:
    fk_user_status1_idx:
        columns:
            - status_id
id:
    id:
        type: integer
        nullable: false
        options:
            unsigned: false
            comment: 'user Primary Key'
        id: true
        generator:
            strategy: IDENTITY
fields:
   # ....

manyToOne:
    status:
        targetEntity: Status
        cascade: {  }
        joinColumns:
            status_id:
                referencedColumnName: id
        orphanRemoval: false
manyToMany:
    roles:
        targetEntity: Role
        joinTable:
            name: user_has_role
            joinColumns:
                user_id:
                    referencedColumnName: id
            inverseJoinColumns:
                role_id:
                    referencedColumnName: id
lifecycleCallbacks: {  }
我试图改变User.orm.yml文件中状态的
fetch:
,使其值为LAZY和EAGER,但没有改变任何内容

我尽量使这篇文章简洁,所以如果我遗漏了任何重要的细节,请告诉我

***更新***

我没有根据一个参数设置映射/反转选项。我现在删除了“null”生成的值,以便状态与链接的文档匹配。状态表和实体不包含任何方式返回用户的引用

在IDE中运行调试时,我发现isEnabled()被调用了两次。。。isEnabled()的第一个调用看起来工作正常$statsObj==代理对象,当我调用$statusObj->getStatus()时,我看到它像预期的那样返回“Active”。然后该函数返回true,调试器第二次跳回isEnabled()。第二次运行isEnabled()我的用户对象为空。几个小时绞尽脑汁想弄清楚为什么isEnabled()运行了两次。。。我终于想到,第一次运行是在登录时,第二次运行是在身份验证通过后的重定向期间。事实证明,整个问题在于$this->status从未添加到Serialize/Unserialize函数中,因此在Unserialize之后以及调用inEnabled验证失败时,status属性为null


解决方案与所描述的问题相去甚远,除非有人有任何建议使其对其他人有用,否则我将投票删除。

由于代理的延迟加载机制,原则将您的关系包装在代理中。当直接访问
$this->status
时,您将获得该代理对象

尝试改用getter:

public function isEnabled() {
    if( $this->getStatus()->getStatus() != "Active" ){
        return false;
    }
    ...
}

这看起来有点可笑,但是
$this->getStatus()
为您提供了状态实体,另外的
getStatus()
要求状态实体的字段“Status”。

由于延迟加载机制,条令将您的关系包装在代理中。当直接访问
$this->status
时,您将获得该代理对象

尝试改用getter:

public function isEnabled() {
    if( $this->getStatus()->getStatus() != "Active" ){
        return false;
    }
    ...
}

这看起来有点可笑,但是
$this->getStatus()
为您提供了状态实体,另外的
getStatus()
要求输入状态实体的字段“Status”。

您还没有发布状态实体代码,但您可能需要这样更改:

manyToOne:
    status:
        targetEntity: Status
        cascade: {  }
        orphanRemoval: false
          inversedBy: value_in_Status
        joinColumn:
            name: status_id
            referencedColumnName: id

请注意,您有“joinColumns”而不是“joinColumn”。

您还没有发布您的状态实体代码,但您可能需要这样更改:

manyToOne:
    status:
        targetEntity: Status
        cascade: {  }
        orphanRemoval: false
          inversedBy: value_in_Status
        joinColumn:
            name: status_id
            referencedColumnName: id

请注意,您使用的是“joinColumns”而不是“joinColumn”。

我现在没有时间给出完整的答案(对不起),但乍一看,您的ManyTone上似乎没有设置inversedBy来表示状态。您还需要从Status->user在onetomany关系上设置mappedBy。这可能会有所帮助。另外,请检查symfony调试器在“查询”区域下显示的内容,它将显示未正确配置的实体关系。AppBundle\entity\Status-尝试在Join上使用targetEntity的完全限定名称。我现在没有时间获得完整答案(抱歉),但乍一看,你似乎还没有把你的曼尼通设定为地位。您还需要从Status->user在onetomany关系上设置mappedBy。这可能会有所帮助。另外,请检查symfony调试器在“查询”区域下显示的内容,它将显示未正确配置的实体关系。AppBundle\entity\Status-尝试在joinsunderstood上使用targetEntity的完全限定名,但我认为我的属性/实体命名在此处会引起一些混淆。我不是在上面的函数中调用$this->getStatus(),而是引用私有变量$this->status(当然,getStuats()会返回这个变量)。因此,设置$status=$this->status并调用$status->getStatus()在我看来与$this->getStatus()->getStatus()相同。这两个都是用户实体中有效的$this->status->getStatus()。可以理解,但我认为我的属性/实体命名在这里造成了一些混乱。我不是在上面的函数中调用$this->getStatus(),而是引用私有变量$this->status(当然,getStuats()会返回这个变量)。因此,设置$status=$this->status并调用$status->getStatus()在我看来与$this->getStatus()->getStatus()相同。二者在用户实体中都是有效的$this->status->getStatus()。YAML主要是从现有数据库架构生成的,这可能解释了为什么joinColumns取代了joinColumn。YAML主要是从现有数据库架构生成的,这可能解释了为什么joinColumns取代了joinColumn。