我正在使用DoctrineExtensions
为我的实体获取可阻塞的行为。作为我的一个实体,我想将相关地址实体的城市字段用于段塞。然而,我不知道如何访问它:
/**
* @var FooSiteBundleEntityAddress
*
* @ORMManyToOne(targetEntity="FooSiteBundleEntityAddress", cascade={"persist"})
* @ORMJoinColumns({
* @ORMJoinColumn(name="address_id", referencedColumnName="id")
* })
*/
private $address;
/**
* @GedmoSlug(fields={"address->city", "name"})
* @ORMColumn(length=128, unique=true)
*/
private $slug;
我怎样才能做到这一点?
您可以执行以下操作:https://github.com/l3pp4rd/DoctrineExtensions/issues/86
但是在这里https://github.com/l3pp4rd/DoctrineExtensions:
2012-02-26
删除了段塞处理程序,该功能带来了无法维护。
不幸的是,此功能已被删除!
所以我认为你必须改变你的逻辑:例如,你可以使用一个包含地址段和当前实体的路由,并加载实体作为响应:
@Route("/user/{slugUser}/{slugAddress}.html", requirements={"slugUser"="^[a-z0-9-]+", "slugAddress"="^[a-z0-9-]+"})
或者也许是一个解决方案,尝试手动设置。。。并自动使用生命周期,但我不确定它是否有效:
/**
* @GedmoSlug(fields={})
* @ORMColumn(length=128, unique=true)
*/
private $slug;
/**
* @ORMPrePersist
*/
public function updateSlug()
{
$this->setSlug($this->name.$this->address->getCity());
}
您不能直接执行此操作,因为slackable扩展只能使用实体的直接字段。我唯一能想到的方法是添加一个跟踪地址所在城市的字段,尽管这有点笨拙。类似于:
/**
* @ORMColumn(length=128)
*/
private $city;
/**
* @GedmoSlug(fields={"city", "name"})
* @ORMColumn(length=128, unique=true)
*/
private $slug;
//setter for Address
public function setAddress($address) {
$this->address= $address;
$this->city = $address->getCity();
}
我真的不确定city是否需要持久化到数据库中(即,是否需要使用@ORM\Column),或者扩展是否可以使用未持久化的属性,只需在不使用@ORM注释的情况下尝试,看看它是否有效。