【发布时间】: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