我有一个有效的博客,但我认为关于不错的网址有点迟了。
我不想使用slugable等捆绑包,因为我没有太多时间阅读文档并实现它们。
是否有可能到达实体的某个字段并从doctrine执行到db之前生成slug?
我在实体中想到了一个简单的解决方案,如:
public function __construct() {
$this->setPostedAt(new \DateTime());
$this->setSlug();
}
public function setSlug(){
$tmpslug = (string)$this->id."-";
$tmpslug .= $this->slugify($this->title);
$this->slug = $tmpslug;
}
然而,当构造()调用时,id和title字段为空,这不起作用。
是否有任何快速解决方案不需要实施新的扩展?
谢谢!
答案 0 :(得分:3)
我不会'认为Sluggable(来自DoctrineExtensions)将花费更多时间,而不是重新发明准备好的轮子。我使用它,需要10分钟才能使用。
"stof/doctrine-extensions-bundle": "~1.1@dev"
添加到composer.json
config.yml
:配置:
stof_doctrine_extensions:
orm:
default:
uploadable: false
sluggable: true
timestampable: false
translatable: false
tree: false
blameable: false
loggable: false
sortable: false
softdeleteable: false
slug
字段和getter / setter添加到您的实体代码:
private $slug;
public function getSlug() {...}
public function setSlug($slug) {...}
xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-mapping"
添加到ENTITY.orm.xml中的doctrine-mapping
部分(如果您正在使用xml)代码:
<field name="slug" column="slug" type="string">
<gedmo:slug fields="title(OR_YOUR_DESIRED_FIELD)" unique="true" updatable="true" />
</field>
它,你可以忘记它,你不需要设置,事件听众会照顾它..
答案 1 :(得分:0)
Okey..Just忘了Lifecycle Callbacks的学说功能。 所以答案不是将函数调用放在构造函数中,而是使用映射信息更新函数:
/**
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function setSlug(){
$tmpslug = (string)$this->id."-";
$tmpslug = $this->slugify($this->title);
$this->slug = $tmpslug;
}
也不要忘记更新实体映射
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()