3

我正在使用DoctrineExtensions为我的实体获取 sluggable 行为。我的实体之一我想将相关地址实体的城市字段用于蛞蝓。但是,我不知道如何访问它:

/**
 * @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;

我怎样才能使这项工作?

4

2 回答 2

1

你可以执行它:https ://github.com/l3pp4rd/DoctrineExtensions/issues/86

但在这里https://github.com/l3pp4rd/DoctrineExtensions

2012-02-26

删除了 slug 处理程序,此功能带来了无法维护的复杂性。

不幸的是,这个功能被删除了!

所以我认为你必须改变你的逻辑:例如,你可以使用包含地址和当前实体的路由并加载实体作为响应:

@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());
}
于 2012-09-04T12:31:38.633 回答
0

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

/**
 * @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 注释看看它是否有效。

于 2012-09-04T12:34:38.493 回答