【问题标题】:Symfony 4 entity getters return typesSymfony 4 实体获取器返回类型
【发布时间】:2019-06-16 05:05:14
【问题描述】:

我目前正在使用带有 Sonata Admin 的 PHP 7.1 上的 Symfony 4.1,实体 getter 返回类型存在一些问题...因为我知道哪些字段可以为空,所以我可以设置强制或可选的返回类型。但是当我在奏鸣曲管理员的创建表单上绑定实体时,这种方法不起作用,因为实体没有初始化并且所有字段都设置为空。解决方法很明显,但哪个更正确?

解决方案 1: 使返回类型可选(可为空)

 /**
 * @ORM\Table(name="banner__banner_zone_relation")
 * @ORM\Entity()
 */
class BannerZoneRelation implements TimestampableInterface
{
    /**
     * @var Banner
     * @ORM\ManyToOne(targetEntity="App\Entity\Banner\Banner", inversedBy="bannerZoneRelations", cascade={"persist"})
     * @ORM\JoinColumn(name="banner_id", referencedColumnName="id")
     */
    protected $banner;

    /**
     * @var Zone
     * @ORM\ManyToOne(targetEntity="App\Entity\Banner\Banner",inversedBy="bannerZoneRelations", cascade={"persist"})
     * @ORM\JoinColumn(name="zone_id", referencedColumnName="id")
     */
    protected $zone;

    /
    /**
     * @return Banner|null
     */
    public function getBanner(): ?Banner
    {
        return $this->banner;
    }

    /**
     * @return Zone|null
     */
    public function getZone(): ?Zone
    {
        return $this->zone;
    }
}

解决方案 2: 在构造函数中创建 Banner 和 Zone 的实例

 /**
 * @ORM\Table(name="banner__banner_zone_relation")
 * @ORM\Entity()
 */
class BannerZoneRelation implements TimestampableInterface
{
    /**
     * @var Banner
     * @ORM\ManyToOne(targetEntity="App\Entity\Banner\Banner", inversedBy="bannerZoneRelations", cascade={"persist"})
     * @ORM\JoinColumn(name="banner_id", referencedColumnName="id")
     */
    protected $banner;

    /**
     * @var Zone
     * @ORM\ManyToOne(targetEntity="App\Entity\Banner\Banner",inversedBy="bannerZoneRelations", cascade={"persist"})
     * @ORM\JoinColumn(name="zone_id", referencedColumnName="id")
     */
    protected $zone;

    public function __construct()
    {
        $this->banner = new Banner();
        $this->zone = new Zone();
    }

    /
    /**
     * @return Banner
     */
    public function getBanner(): Banner
    {
        return $this->banner;
    }

    /**
     * @return Zone
     */
    public function getZone(): Zone
    {
        return $this->zone;
    }
}

哪种解决方案更好?感谢您的任何回答!

【问题讨论】:

  • Tbh,这可能是个人喜好。我认为是选项 2。
  • 另一种方法是在将模型传递给表单之前将它们设置在控制器中。即__construct(Banner $banner, Zone $zone) 老实说,这归结为更喜欢哪种方法以及哪种方法最适合您的应用程序开发要求。对我来说,如果getBanner 上的关系是DELETE CASCADE,那么我会强制要求返回,否则如果是DELETE SET NULL,那么我希望返回NULL。因为您的应用程序将依赖于实体获取器,而不仅仅是在表单中。
  • 您不能使用选项 2,因为您很快就必须用空值初始化所有实体。正如我所说,在我下面的评论中,选项 1 是要走的路

标签: php symfony symfony4 return-type php-7.1


【解决方案1】:

我认为选项 1(返回 null)这样如果不需要,就不会在数据库中创建区域和横幅记录。

【讨论】:

  • +1 !选项1绝对是要走的路。当您使用 MakerBundle 生成实体时,我们可以看到它是生成它的方式,主要是针对使用表单组件操作新实体的此类问题。
猜你喜欢
  • 2018-06-03
  • 2017-02-22
  • 2018-10-24
  • 2017-05-14
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多