У меня есть рабочий блог, но я немного поздно подумал о хороших URL.
Я не хочу использовать slugable и так далее в связках, потому что у меня не так много времени, чтобы прочитать документацию и реализовать ее.
Можно ли добраться до поля сущности и создать слаг из него до того, как доктрина исполнится в БД?
Я думал о простом решении в сущности, как:
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 будут пустыми при вызове construct ().
Есть ли какое-нибудь быстрое решение, которое бы не требовало реализации нового расширения?
Спасибо!
Я не думаю, что 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
поле и геттер / сеттер для вашей сущностикод:
private $slug;
public function getSlug() {...}
public function setSlug($slug) {...}
xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-mapping"
в doctrine-mapping
раздел в вашем ENTITY.orm.xml (если вы используете XML)код:
<field name="slug" column="slug" type="string">
<gedmo:slug fields="title(OR_YOUR_DESIRED_FIELD)" unique="true" updatable="true" />
</field>
вот и все, вы можете забыть об этом, вам не нужно устанавливать, слушатели событий позаботятся об этом ..
Окей .. Только что забыл функцию обратного вызова жизненного цикла доктрины.
Таким образом, ответ заключается не в том, чтобы поместить вызов функции в конструктор, а в обновление функции информацией о сопоставлении:
/**
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function setSlug(){
$tmpslug = (string)$this->id."-";
$tmpslug = $this->slugify($this->title);
$this->slug = $tmpslug;
}
Также не забудьте обновить отображение сущностей
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()