Symfony создать слаг из названия сущностей

У меня есть рабочий блог, но я немного поздно подумал о хороших 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 ().

Есть ли какое-нибудь быстрое решение, которое бы не требовало реализации нового расширения?

Спасибо!

2

Решение

Я не думаю, что Sluggable (из DoctrineExtensions) займет больше времени, чем изобретать готовое колесо. Я бы использовал его, чтобы быть готовым к использованию, требуется 10 минут.

  1. добавлять "stof/doctrine-extensions-bundle": "~1.1@dev" в composer.json
  2. добавить конфиги к 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
  1. добавлять slug поле и геттер / сеттер для вашей сущности

код:

private $slug;
public function getSlug() {...}
public function setSlug($slug) {...}
  1. добавлять xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-mapping" в doctrine-mapping раздел в вашем ENTITY.orm.xml (если вы используете XML)
  2. добавьте поле slug в ваш файл ENTITY.orm.xml (если вы используете xml);

код:

<field name="slug" column="slug" type="string">
<gedmo:slug fields="title(OR_YOUR_DESIRED_FIELD)" unique="true" updatable="true" />
</field>

вот и все, вы можете забыть об этом, вам не нужно устанавливать, слушатели событий позаботятся об этом ..

3

Другие решения

Окей .. Только что забыл функцию обратного вызова жизненного цикла доктрины.
Таким образом, ответ заключается не в том, чтобы поместить вызов функции в конструктор, а в обновление функции информацией о сопоставлении:

/**
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function setSlug(){
$tmpslug = (string)$this->id."-";
$tmpslug = $this->slugify($this->title);

$this->slug = $tmpslug;
}

Также не забудьте обновить отображение сущностей

/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()
0

По вопросам рекламы [email protected]