У меня есть большой проект, перенесенный с symfony3 на symfony4 (версия 4.0.8) с несколькими службами (подписчики событий и прослушиватели событий), которые работают должным образом, за исключением одного (LogActivityListener). Если я отключу LogActivityListener, закомментировав его раздел в services.yaml, все остальное будет работать отлично. Единственное, что отличает этот сервис от других, это то, что он автоматически вводит EntityManager. Я предполагаю, что в моих файлах конфигурации есть что-то, что создает проблему, но, как ни странно, мой проект отлично работает с моей базой данных, за исключением этой единственной службы.
Вот ошибка, которую я вижу на консоли, когда LogActivityListener включен:
bin/console cache:clear --no-warmup
PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 8192 bytes) in /var/www/sites.clients/brcnd/var/cache/dev/ContainerXAH2ooY/getDoctrine_Orm_DefaultEntityManagerService.php on line 24 PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 32768 bytes) in /var/www/sites.clients/brcnd/vendor/symfony/debug/Exception/OutOfMemoryException.php on line 1
Мой код, указанный ниже, очевидно, мало что делает (реальный сервис действительно работает), но он создает указанную выше ошибку.
// doctrine.yaml
parameters:
env(DATABASE_URL): ''
doctrine:
dbal:
default_connection: default
driver: 'pdo_mysql'
server_version: 'mariadb-10.1.32'
charset: utf8
url: '%env(resolve:DATABASE_URL)%'
orm:
default_entity_manager: ~
auto_generate_proxy_classes: '%kernel.debug%'
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: App
// services.yaml
services:
_defaults:
autowire: true
autoconfigure: true
public: false
App\:
resource: '../src/*'
App\Controller\:
resource: '../src/Controller'
tags: ['controller.service_arguments']
App\Doctrine\LogActivityListener:
tags:
- { name: doctrine.event_subscriber }
И мой сервис:
// /src/Doctrine/LogActivityListener
<?php
namespace App\Doctrine;
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
class LogActivityListener implements EventSubscriber
{
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public function getSubscribedEvents()
{
return ['postPersist'];
}
/**
* Listener attached to newly created records
*/
public function postPersist(LifecycleEventArgs $args)
{
$entity = $args->getObject();
return true;
}
}
Спасибо, именно то, что мне нужно!






Вы не можете внедрить EntityManager в прослушиватель доктрины, EntityManager доступен через LifecycleEventArgs (например,
$em = $args->getEntityManager();)