Skip to content

Instantly share code, notes, and snippets.

@GubaEvgeniy
Last active October 25, 2019 09:19
Show Gist options
  • Select an option

  • Save GubaEvgeniy/7be1dc526bd80bc4f931875238911b96 to your computer and use it in GitHub Desktop.

Select an option

Save GubaEvgeniy/7be1dc526bd80bc4f931875238911b96 to your computer and use it in GitHub Desktop.

DoctrineExtensions

StofDoctrineExtensionsBundle

Документация

Этот пакет обеспечивает интеграцию для DoctrineExtensions.

Особенности:

  • Tree - автоматизирует процесс обработки дерева и добавляет некоторые специфичные для дерева функции в хранилище. (closure, nestedset или materialized path).
  • Translatable - дает очень удобное решение для перевода записей на разные языки.
  • Sluggable - переводит поле в уникальный slug
  • Timestampable - обновляет даты при создании, обновлении и даже изменении полей таблицы
  • Blameable - обновляет строковые или ссылочные поля при создании, обновлении и даже изменении свойств со строкой или объектом.
  • Loggable - помогает отслеживать историю изменений.
  • Sortable - позволяет сделать любой документ или entity сортируемой
  • Softdeleteable - позволяет неявно удалять записи
  • Uploadable - обеспечивает обработку загрузки файлов в полях entity
  • Reference Integrity - обеспечивает ссылочную целостность для MongoDB, поддерживает аннулирование и ограничения

Установка: composer require stof/doctrine-extensions-bundle

В результате появится файл в котором указывается конфигурация config/packages/stof_doctrine_extensions.yaml, со следующими настройками по-умолчанию:

# Read the documentation: https://symfony.com/doc/current/bundles/StofDoctrineExtensionsBundle/index.html
# See the official DoctrineExtensions documentation for more details: https://github.com/Atlantic18/DoctrineExtensions/tree/master/doc/
stof_doctrine_extensions:
    default_locale: en_US

В этом файле и настраиваются необходимы расширения.

Sluggable

В качестве примера используем Sluggable - расширение которое отвечает за перевод какого-либо поля entity в slug. В файле config/packages/stof_doctrine_extensions.yaml допишем orm:, затем default(default относится к менеджерам entity по-умолчанию, т.к. некоторые проекты могут иметь сразу несколько менеджеров entity). И включим расширение sluggable: true

# Read the documentation: https://symfony.com/doc/current/bundles/StofDoctrineExtensionsBundle/index.html
# See the official DoctrineExtensions documentation for more details: https://github.com/Atlantic18/DoctrineExtensions/tree/master/doc/
stof_doctrine_extensions:
    default_locale: en_US
    orm:
        default:
            sluggable: true

Теперь необходимо задать настройки в файле entity(а это напомню - src/Entity/Article.php). Тут есть свойство $slug, к аннотации которого необходимо добавить @Gedmo\Slug(fields={"title"}) (это описанно в документации ), где title это имя поля из которого нужно генерировать slug.

А в подключаемых файлах не забыть подключить сам пакет use Gedmo\Mapping\Annotation as Gedmo;

/**
 * @ORM\Column(type="string", length=100, unique=true)
 * @Gedmo\Slug(fields={"title"})
 */
private $slug;

Timestampable

Добавим автоматическое генерирование времени для полей createdAt и updatedAt, ведь всегда полезно знать когда была создана та или иная запись и время последнего изменения.

В файле config/packages/stof_doctrine_extensions.yamlдобавим в конфиг timestampable: true:

stof_doctrine_extensions:
    default_locale: en_US
    orm:
        default:
            sluggable: true
            timestampable: true

До этого мы уже добавили два данных поля в файле src/Entity/Article.php. Теперь необходимо расширить аннотации используя @Gedmo\Timestampable(on="create") и @Gedmo\Timestampable(on="update")

/**
* @ORM\Column(type="datetime")
* @Gedmo\Timestampable(on="create")
*/
private $createdAt;

/**
* @ORM\Column(type="datetime")
* @Gedmo\Timestampable(on="update")
*/
private $updatedAt;

Так же есть возможность для встраивания уже готового функционала Timestampable. В классе src/Entity/Article.php удалите созданные до этого поля createdAt и updatedAt, а так же связанные с ними сеттеры и геттеры. Вместо них используем трейт use TimestampableEntity;, которй находится в use Gedmo\Timestampable\Traits\TimestampableEntity;. Данный трейт содержит точно такие же поля, геттеры и сеттеры для createdAt и updatedAt

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment