Как настроить «сущности» для «многоразового пакета» в Symfony 4.x?

Я использую symfony 4.x, я создал повторно используемый пакет для надстройки easyadmin. Я создаю объект, который хорошо известен, но при отправке данных у меня есть метод _prePersist для HasLifecycleCallbacks, который не обнаружен.

/**
 * @ORM\HasLifecycleCallbacks()
 * @ORM\Table
 * @ORM\Entity
 */
class Post
{}
/**
 * @ORM\PrePersist
 */
public function _prePersist()
{
  dump($this);die;
}

Пожалуйста, предоставьте более подробную информацию. Как вы сохраняете объект? Где этот PrePersist-Hook и когда он должен срабатывать и как? Например, это событие Doctrine или оно должно подключаться к событию EasyAdmin-Bundle (см. github.com/EasyCorp/EasyAdminBundle/blob/master/src/Controller/…)? Вы проверили с помощью bin/console debug:events, правильно ли зарегистрировано событие?

dbrumann 02.04.2019 12:30

Хорошо, когда я создаю сообщение, у меня есть поле slug, которым я хотел бы автоматически управлять в методе сущности, используя события жизненного цикла. Я всегда это делаю, и он всегда ходит, но когда я перемещаю свой код из папки src/в lib/acmebundle, он больше не работает. А поскольку поле slug обязательно, проверка формы не проходит. в src/Entity работает, а в lib/AcmeBundle/Entity не работает

Lee Green 02.04.2019 13:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
1 645
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно будет обновить конфигурацию вашего пакета, чтобы зарегистрировать как папку, в которой вы храните свои сущности, так и, возможно, события жизненного цикла. При размещении их в src/Entity в этом нет необходимости, потому что DoctrineBundle уже предоставляет для этого конфигурацию по умолчанию. Вот почему в вашем config/packages/doctrine.yaml у вас есть следующее:

doctrine:
    orm:
        mappings:
            App:
                is_bundle: false
                type: annotation
                dir: '%kernel.project_dir%/src/Entity'
                prefix: 'App\Entity'
                alias: App

Вы должны отслеживать, как DoctrineBundle считывает и обрабатывает эту конфигурацию из Конфигурация.php, а затем как сервис-контейнер настраивается из этих значений конфигурации, просматривая DoctrineExtension.php. Вероятно, вы можете опустить файл конфигурации, но ваш MyBundleExtension должен обновить службы Doctrine с помощью ваших классов сущностей из пакета.

В качестве альтернативы вы можете посмотреть рецепты и вместо того, чтобы хранить Entity в своем пакете, скопируйте его в каталог src/ всякий раз, когда ваш пакет установлен. Из-за того, как работают рецепты, для этого ваш пакет должен быть с открытым исходным кодом, и вам нужно будет предоставить contrib-рецепт для этого пакета.

edit: Другой вариант может заключаться в том, чтобы предоставить полный скелет для вашей базовой настройки, чтобы вам не нужно было беспокоиться о пакетах и ​​независимой конфигурации, а вместо этого просто предоставить базовое начальное приложение с настройкой по умолчанию, которую вы считаете полезной.

Можете ли вы дать мне небольшой демонстрационный пример для решения 1 и 3?

Lee Green 02.04.2019 14:03

Что касается решения 3, вы можете взять Symfony/демо в качестве примера. Просто создайте небольшое приложение, которое, по вашему мнению, соответствует вашей идее «скелета проекта», создайте репозиторий Github, а затем либо предоставьте пакет через упаковщика, например Symfony/symfony-демо, а затем вы можете создавать новые проекты из этого скелета, как описано в документах. с composer create-project .... Если вы не хотите создавать проект, это немного сложнее (см.: github.com/composer/composer/issues/2920#issuecomment-190303‌​745)

dbrumann 02.04.2019 18:51

Что касается решения 1, оно потребует некоторой работы, и я не думаю, что смогу адекватно объяснить его, не потратив на это слишком много времени. Я предлагаю просмотреть оба связанных файла в качестве основы и документы Symfony для Расширения и Конфигурация пакета.

dbrumann 02.04.2019 18:53

Другие вопросы по теме