使用关联的实体字段设置段塞


Set slug using associated entity field

我正在使用DoctrineExtensions为我的实体获取可阻塞的行为。作为我的一个实体,我想将相关地址实体的城市字段用于段塞。然而,我不知道如何访问它:

/**
 * @var Foo'SiteBundle'Entity'Address
 *
 * @ORM'ManyToOne(targetEntity="Foo'SiteBundle'Entity'Address", cascade={"persist"})
 * @ORM'JoinColumns({
 *   @ORM'JoinColumn(name="address_id", referencedColumnName="id")
 * })
 */
private $address;
/**
 * @Gedmo'Slug(fields={"address->city", "name"})
 * @ORM'Column(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-]+"})

或者也许是一个解决方案,尝试手动设置。。。并自动使用生命周期,但我不确定它是否有效:

/**
 * @Gedmo'Slug(fields={})
 * @ORM'Column(length=128, unique=true)
 */
private $slug;
/**
 * @ORM'PrePersist
 */
public function updateSlug()
{
    $this->setSlug($this->name.$this->address->getCity());
}

您不能直接执行此操作,因为slackable扩展只能使用实体的直接字段。我唯一能想到的方法是添加一个跟踪地址所在城市的字段,尽管这有点笨拙。类似于:

/**
 * @ORM'Column(length=128)
 */
private $city;
/**
 * @Gedmo'Slug(fields={"city", "name"})
 * @ORM'Column(length=128, unique=true)
 */
private $slug;
//setter for Address
public function setAddress($address) {
    $this->address= $address;
    $this->city = $address->getCity();
}

我真的不确定city是否需要持久化到数据库中(即,是否需要使用@ORM''Column),或者扩展是否可以使用未持久化的属性,只需在不使用@ORM注释的情况下尝试,看看它是否有效。