Я использую symfony 4.x, я создал повторно используемый пакет для надстройки easyadmin. Я создаю объект, который хорошо известен, но при отправке данных у меня есть метод _prePersist для HasLifecycleCallbacks, который не обнаружен.
/**
* @ORM\HasLifecycleCallbacks()
* @ORM\Table
* @ORM\Entity
*/
class Post
{}
/**
* @ORM\PrePersist
*/
public function _prePersist()
{
dump($this);die;
}
Хорошо, когда я создаю сообщение, у меня есть поле slug, которым я хотел бы автоматически управлять в методе сущности, используя события жизненного цикла. Я всегда это делаю, и он всегда ходит, но когда я перемещаю свой код из папки src/в lib/acmebundle, он больше не работает. А поскольку поле slug обязательно, проверка формы не проходит. в src/Entity работает, а в lib/AcmeBundle/Entity не работает






Вам нужно будет обновить конфигурацию вашего пакета, чтобы зарегистрировать как папку, в которой вы храните свои сущности, так и, возможно, события жизненного цикла. При размещении их в 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?
Что касается решения 3, вы можете взять Symfony/демо в качестве примера. Просто создайте небольшое приложение, которое, по вашему мнению, соответствует вашей идее «скелета проекта», создайте репозиторий Github, а затем либо предоставьте пакет через упаковщика, например Symfony/symfony-демо, а затем вы можете создавать новые проекты из этого скелета, как описано в документах. с composer create-project .... Если вы не хотите создавать проект, это немного сложнее (см.: github.com/composer/composer/issues/2920#issuecomment-190303745)
Что касается решения 1, оно потребует некоторой работы, и я не думаю, что смогу адекватно объяснить его, не потратив на это слишком много времени. Я предлагаю просмотреть оба связанных файла в качестве основы и документы Symfony для Расширения и Конфигурация пакета.
Пожалуйста, предоставьте более подробную информацию. Как вы сохраняете объект? Где этот PrePersist-Hook и когда он должен срабатывать и как? Например, это событие Doctrine или оно должно подключаться к событию EasyAdmin-Bundle (см. github.com/EasyCorp/EasyAdminBundle/blob/master/src/Controller/…)? Вы проверили с помощью
bin/console debug:events, правильно ли зарегистрировано событие?