Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

EntityManager - Cannot bind an instance to a static closure #33037

Closed
stevro opened this issue Aug 8, 2019 · 12 comments
Closed

EntityManager - Cannot bind an instance to a static closure #33037

stevro opened this issue Aug 8, 2019 · 12 comments

Comments

@stevro
Copy link

stevro commented Aug 8, 2019

Symfony version(s) affected: 4.4.*
PHP Version: PHP 7.3.7-2+ubuntu18.04.1

Description
PHP Warning: Cannot bind an instance to a static closure in /tmp/intima/cache/ContainerXozEiPa/EntityManager_9a5be93.php on line 317
!! PHP Fatal error: Uncaught Error: Call to a member function __invoke() on null in /tmp/intima/cache/ContainerXozEiPa/EntityManager_9a5be93.php:317
!! Stack trace:
!! #0 /tmp/intima/cache/ContainerXozEiPa/srcApp_KernelDevDebugContainer.php(399): EntityManager_9a5be93::staticProxyConstructor(Object(Closure))
!! #1 /tmp/intima/cache/ContainerXozEiPa/srcApp_KernelDevDebugContainer.php(235): ContainerXozEiPa\srcApp_KernelDevDebugContainer->ContainerXozEiPa{closure}()
!! #2 /tmp/intima/cache/ContainerXozEiPa/srcApp_KernelDevDebugContainer.php(400): ContainerXozEiPa\srcApp_KernelDevDebugContainer->createProxy('EntityManager_9...', Object(Closure))
!! #3 /tmp/intima/cache/ContainerXozEiPa/srcApp_KernelDevDebugContainer.php(2096): ContainerXozEiPa\srcApp_KernelDevDebugContainer->getDoctrine_Orm_DefaultEntityManagerService()
!! #4 /tmp/intima/cache/ContainerXozEiPa/getValidator_Mapping_CacheWarmerService.php(9): ContainerXozEiPa\srcApp_KernelDevDebugContainer->getValidator_BuilderService()
!! #5 /tmp/intima/cache/ContainerXozEiPa/srcApp_KernelDevDebugConta in /tmp/intima/cache/ContainerXozEiPa/EntityManager_9a5be93.php on line 317

How to reproduce
Update Symfony to latest version 4.4.*
Run cache:clear

@s0h1s2
Copy link

s0h1s2 commented Aug 8, 2019

what's exactly your problem

@stevro
Copy link
Author

stevro commented Aug 8, 2019

After updating the vendors to latest version I end up with a Fatal Error.
PHP Fatal error: Uncaught Error: Call to a member function __invoke() on null in /tmp/intima/cache/ContainerXozEiPa/EntityManager_9a5be93.php:317

I tried to delete the cache manually and it produces the same error.

@xabbuh
Copy link
Member

xabbuh commented Aug 8, 2019

Can you please create a small example application that allows to reproduce this?

@derrabus
Copy link
Member

derrabus commented Aug 8, 2019

PHP Version: PHP 7.3.7-2+ubuntu18.04.1

Just to eliminate a possible cause: Have you tried to upgrade to php 7.3.8? php 7.3.7 is a bit problematic for Symfony, especially during cache warmup.

@stevro
Copy link
Author

stevro commented Aug 8, 2019

I tracked the problem to symfony/proxy-manager-bridge (4.4.x-dev 2d6e1a5)

I've placed my composer.json file in this gist https://gist.github.com/stevro/f1f2806a118dd611868ea8f7c5a78db3

I've also updated PHP to 7.3.8

@derrabus
Copy link
Member

derrabus commented Aug 8, 2019

I can reproduce the problem by running composer on php 7.3.8 install with your composer.json.

In srcApp_KernelDevDebugContainer.php line 405:

  [Symfony\Component\ErrorHandler\Exception\FatalErrorException]
  Compile Error: ContainerMvu65hU\srcApp_KernelDevDebugContainer::load(): Failed opening required '/Volumes/Projects/Misc/cache-warm-bug/var/cache/dev/ContainerMvu65hU/EntityManager_9a5be93.php' (include_path='.:/usr/local/Cellar/php/7.3.8/share/php/pear')


Exception trace:
 () at /Volumes/Projects/Misc/cache-warm-bug/var/cache/dev/ContainerMvu65hU/srcApp_KernelDevDebugContainer.php:405
 ContainerMvu65hU\srcApp_KernelDevDebugContainer->load() at /Volumes/Projects/Misc/cache-warm-bug/var/cache/dev/ContainerMvu65hU/srcApp_KernelDevDebugContainer.php:410
 ContainerMvu65hU\srcApp_KernelDevDebugContainer->createProxy() at /Volumes/Projects/Misc/cache-warm-bug/var/cache/dev/ContainerMvu65hU/srcApp_KernelDevDebugContainer.php:504
 ContainerMvu65hU\srcApp_KernelDevDebugContainer->getDoctrine_Orm_DefaultEntityManagerService() at /Volumes/Projects/Misc/cache-warm-bug/var/cache/dev/ContainerMvu65hU/srcApp_KernelDevDebugContainer.php:1554
 ContainerMvu65hU\srcApp_KernelDevDebugContainer->getValidator_BuilderService() at /Volumes/Projects/Misc/cache-warm-bug/var/cache/dev/ContainerMvu65hU/getValidator_Mapping_CacheWarmerService.php:13
 ContainerMvu65hU\srcApp_KernelDevDebugContainer->() at /Volumes/Projects/Misc/cache-warm-bug/var/cache/dev/ContainerMvu65hU/srcApp_KernelDevDebugContainer.php:405
 ContainerMvu65hU\srcApp_KernelDevDebugContainer->load() at /Volumes/Projects/Misc/cache-warm-bug/var/cache/dev/ContainerMvu65hU/getCacheWarmerService.php:13
 ContainerMvu65hU\srcApp_KernelDevDebugContainer->{closure:/Volumes/Projects/Misc/cache-warm-bug/var/cache/dev/ContainerMvu65hU/getCacheWarmerService.php:12-20}() at /Volumes/Projects/Misc/cache-warm-bug/vendor/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php:87
 Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate->warmUp() at /Volumes/Projects/Misc/cache-warm-bug/vendor/symfony/framework-bundle/Command/CacheWarmupCommand.php:80
 Symfony\Bundle\FrameworkBundle\Command\CacheWarmupCommand->execute() at /Volumes/Projects/Misc/cache-warm-bug/vendor/symfony/console/Command/Command.php:255
 Symfony\Bundle\FrameworkBundle\Command\CacheWarmupCommand->run() at /Volumes/Projects/Misc/cache-warm-bug/vendor/symfony/console/Application.php:952
 Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand() at /Volumes/Projects/Misc/cache-warm-bug/vendor/symfony/framework-bundle/Console/Application.php:97
 Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand() at /Volumes/Projects/Misc/cache-warm-bug/vendor/symfony/console/Application.php:276
 Symfony\Bundle\FrameworkBundle\Console\Application->doRun() at /Volumes/Projects/Misc/cache-warm-bug/vendor/symfony/framework-bundle/Console/Application.php:83
 Symfony\Bundle\FrameworkBundle\Console\Application->doRun() at /Volumes/Projects/Misc/cache-warm-bug/vendor/symfony/console/Application.php:152
 Symfony\Bundle\FrameworkBundle\Console\Application->run() at /Volumes/Projects/Misc/cache-warm-bug/bin/console:42
 {main}() at /Volumes/Projects/Misc/cache-warm-bug/bin/console:0

cache:warmup [--no-optional-warmers] [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--] <command>

@derrabus
Copy link
Member

derrabus commented Aug 8, 2019

Status: Reviewed

@Devristo
Copy link
Contributor

Devristo commented Aug 15, 2019

Some added context as I am also running into this problem.

  • It is related to symfony/proxy-manager-bridge however I suspect the issue could be in symfony/dependency-injection. Perhaps related to commit c893986.
  • In Symfony 4.3 the EntityManager_9a5be93.php is being generated
  • In Symfony 4.4 the EntityManager_9a5be93.php is NOT being generated
  • In Symfony 4.4 the \dirname(__DIR__,.php is attempted to be created instead

image

Perhaps something is going wrong in \Symfony\Component\DependencyInjection\Dumper\PhpDumper::generateProxyClasses ? See

$file = preg_replace('#^\\$this->targetDirs\[(\d++)\]#', sprintf('\dirname(__DIR__, %d + $1)', $this->asFiles), $file);

It returns an array like this:

{
  "\\dirname(__DIR__,.php": "include_once \\dirname(__DIR__, 1 + 3).'\/vendor\/doctrine\/persistence\/lib\/Doctrine\/Common\/Persistence\/ObjectManager.php';\ninclude_once \\dirname(__DIR__, 1 + 3).'\/vendor\/doctrine\/orm\/lib\/Doctrine\/ORM\/EntityManagerInterface.php';\ninclude_once \\dirname(__DIR__, 1 + 3).'\/vendor\/doctrine\/orm\/lib\/Doctrine\/ORM\/EntityManager.php';\n\nclass EntityManager_9a5be93 extends \\Doctrine\\ORM\\EntityManager implements \\ProxyManager\\Proxy\\VirtualProxyInterface\n{\n\n    \/**\n     * @var \\Closure|null initializer responsible for generating the wrapped object\n     *\/\n    private $valueHolder8f2f0 = null;\n\n    \/**\n     * @var \\Closure|null initializer responsible for generating the wrapped object\n     *\/\n    private $initializerd0fa7 = null;\n\n    \/**\n     * @var bool[] map of public properties of the parent class\n     *\/\n    private static $publicProperties6b99d = [\n        \n    ];\n\n    public function getConnection()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'getConnection', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->getConnection();\n    }\n\n    public function getMetadataFactory()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'getMetadataFactory', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->getMetadataFactory();\n    }\n\n    public function getExpressionBuilder()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'getExpressionBuilder', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->getExpressionBuilder();\n    }\n\n    public function beginTransaction()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'beginTransaction', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->beginTransaction();\n    }\n\n    public function getCache()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'getCache', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->getCache();\n    }\n\n    public function transactional($func)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'transactional', array('func' => $func), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->transactional($func);\n    }\n\n    public function commit()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'commit', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->commit();\n    }\n\n    public function rollback()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'rollback', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->rollback();\n    }\n\n    public function getClassMetadata($className)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'getClassMetadata', array('className' => $className), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->getClassMetadata($className);\n    }\n\n    public function createQuery($dql = '')\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'createQuery', array('dql' => $dql), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->createQuery($dql);\n    }\n\n    public function createNamedQuery($name)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'createNamedQuery', array('name' => $name), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->createNamedQuery($name);\n    }\n\n    public function createNativeQuery($sql, \\Doctrine\\ORM\\Query\\ResultSetMapping $rsm)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'createNativeQuery', array('sql' => $sql, 'rsm' => $rsm), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->createNativeQuery($sql, $rsm);\n    }\n\n    public function createNamedNativeQuery($name)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'createNamedNativeQuery', array('name' => $name), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->createNamedNativeQuery($name);\n    }\n\n    public function createQueryBuilder()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'createQueryBuilder', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->createQueryBuilder();\n    }\n\n    public function flush($entity = null)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'flush', array('entity' => $entity), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->flush($entity);\n    }\n\n    public function find($entityName, $id, $lockMode = null, $lockVersion = null)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'find', array('entityName' => $entityName, 'id' => $id, 'lockMode' => $lockMode, 'lockVersion' => $lockVersion), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->find($entityName, $id, $lockMode, $lockVersion);\n    }\n\n    public function getReference($entityName, $id)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'getReference', array('entityName' => $entityName, 'id' => $id), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->getReference($entityName, $id);\n    }\n\n    public function getPartialReference($entityName, $identifier)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'getPartialReference', array('entityName' => $entityName, 'identifier' => $identifier), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->getPartialReference($entityName, $identifier);\n    }\n\n    public function clear($entityName = null)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'clear', array('entityName' => $entityName), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->clear($entityName);\n    }\n\n    public function close()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'close', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->close();\n    }\n\n    public function persist($entity)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'persist', array('entity' => $entity), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->persist($entity);\n    }\n\n    public function remove($entity)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'remove', array('entity' => $entity), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->remove($entity);\n    }\n\n    public function refresh($entity)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'refresh', array('entity' => $entity), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->refresh($entity);\n    }\n\n    public function detach($entity)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'detach', array('entity' => $entity), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->detach($entity);\n    }\n\n    public function merge($entity)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'merge', array('entity' => $entity), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->merge($entity);\n    }\n\n    public function copy($entity, $deep = false)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'copy', array('entity' => $entity, 'deep' => $deep), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->copy($entity, $deep);\n    }\n\n    public function lock($entity, $lockMode, $lockVersion = null)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'lock', array('entity' => $entity, 'lockMode' => $lockMode, 'lockVersion' => $lockVersion), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->lock($entity, $lockMode, $lockVersion);\n    }\n\n    public function getRepository($entityName)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'getRepository', array('entityName' => $entityName), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->getRepository($entityName);\n    }\n\n    public function contains($entity)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'contains', array('entity' => $entity), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->contains($entity);\n    }\n\n    public function getEventManager()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'getEventManager', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->getEventManager();\n    }\n\n    public function getConfiguration()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'getConfiguration', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->getConfiguration();\n    }\n\n    public function isOpen()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'isOpen', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->isOpen();\n    }\n\n    public function getUnitOfWork()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'getUnitOfWork', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->getUnitOfWork();\n    }\n\n    public function getHydrator($hydrationMode)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'getHydrator', array('hydrationMode' => $hydrationMode), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->getHydrator($hydrationMode);\n    }\n\n    public function newHydrator($hydrationMode)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'newHydrator', array('hydrationMode' => $hydrationMode), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->newHydrator($hydrationMode);\n    }\n\n    public function getProxyFactory()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'getProxyFactory', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->getProxyFactory();\n    }\n\n    public function initializeObject($obj)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'initializeObject', array('obj' => $obj), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->initializeObject($obj);\n    }\n\n    public function getFilters()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'getFilters', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->getFilters();\n    }\n\n    public function isFiltersStateClean()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'isFiltersStateClean', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->isFiltersStateClean();\n    }\n\n    public function hasFilters()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'hasFilters', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return $this->valueHolder8f2f0->hasFilters();\n    }\n\n    \/**\n     * Constructor for lazy initialization\n     *\n     * @param \\Closure|null $initializer\n     *\/\n    public static function staticProxyConstructor($initializer)\n    {\n        static $reflection;\n\n        $reflection = $reflection ?? new \\ReflectionClass(__CLASS__);\n        $instance = $reflection->newInstanceWithoutConstructor();\n\n        \\Closure::bind(function (\\Doctrine\\ORM\\EntityManager $instance) {\n            unset($instance->config, $instance->conn, $instance->metadataFactory, $instance->unitOfWork, $instance->eventManager, $instance->proxyFactory, $instance->repositoryFactory, $instance->expressionBuilder, $instance->closed, $instance->filterCollection, $instance->cache);\n        }, $instance, 'Doctrine\\\\ORM\\\\EntityManager')->__invoke($instance);\n\n        $instance->initializerd0fa7 = $initializer;\n\n        return $instance;\n    }\n\n    protected function __construct(\\Doctrine\\DBAL\\Connection $conn, \\Doctrine\\ORM\\Configuration $config, \\Doctrine\\Common\\EventManager $eventManager)\n    {\n        static $reflection;\n\n        if (! $this->valueHolder8f2f0) {\n            $reflection = $reflection ?? new \\ReflectionClass('Doctrine\\\\ORM\\\\EntityManager');\n            $this->valueHolder8f2f0 = $reflection->newInstanceWithoutConstructor();\n        \\Closure::bind(function (\\Doctrine\\ORM\\EntityManager $instance) {\n            unset($instance->config, $instance->conn, $instance->metadataFactory, $instance->unitOfWork, $instance->eventManager, $instance->proxyFactory, $instance->repositoryFactory, $instance->expressionBuilder, $instance->closed, $instance->filterCollection, $instance->cache);\n        }, $this, 'Doctrine\\\\ORM\\\\EntityManager')->__invoke($this);\n\n        }\n\n        $this->valueHolder8f2f0->__construct($conn, $config, $eventManager);\n    }\n\n    public function & __get($name)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, '__get', ['name' => $name], $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        if (isset(self::$publicProperties6b99d[$name])) {\n            return $this->valueHolder8f2f0->$name;\n        }\n\n        $realInstanceReflection = new \\ReflectionClass(get_parent_class($this));\n\n        if (! $realInstanceReflection->hasProperty($name)) {\n            $targetObject = $this->valueHolder8f2f0;\n\n            $backtrace = debug_backtrace(false);\n            trigger_error(\n                sprintf(\n                    'Undefined property: %s::$%s in %s on line %s',\n                    get_parent_class($this),\n                    $name,\n                    $backtrace[0]['file'],\n                    $backtrace[0]['line']\n                ),\n                \\E_USER_NOTICE\n            );\n            return $targetObject->$name;\n            return;\n        }\n\n        $targetObject = $this->valueHolder8f2f0;\n        $accessor = function & () use ($targetObject, $name) {\n            return $targetObject->$name;\n        };\n        $backtrace = debug_backtrace(true);\n        $scopeObject = isset($backtrace[1]['object']) ? $backtrace[1]['object'] : new \\ProxyManager\\Stub\\EmptyClassStub();\n        $accessor = $accessor->bindTo($scopeObject, get_class($scopeObject));\n        $returnValue = & $accessor();\n\n        return $returnValue;\n    }\n\n    public function __set($name, $value)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, '__set', array('name' => $name, 'value' => $value), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        $realInstanceReflection = new \\ReflectionClass(get_parent_class($this));\n\n        if (! $realInstanceReflection->hasProperty($name)) {\n            $targetObject = $this->valueHolder8f2f0;\n\n            return $targetObject->$name = $value;\n            return;\n        }\n\n        $targetObject = $this->valueHolder8f2f0;\n        $accessor = function & () use ($targetObject, $name, $value) {\n            return $targetObject->$name = $value;\n        };\n        $backtrace = debug_backtrace(true);\n        $scopeObject = isset($backtrace[1]['object']) ? $backtrace[1]['object'] : new \\ProxyManager\\Stub\\EmptyClassStub();\n        $accessor = $accessor->bindTo($scopeObject, get_class($scopeObject));\n        $returnValue = & $accessor();\n\n        return $returnValue;\n    }\n\n    public function __isset($name)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, '__isset', array('name' => $name), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        $realInstanceReflection = new \\ReflectionClass(get_parent_class($this));\n\n        if (! $realInstanceReflection->hasProperty($name)) {\n            $targetObject = $this->valueHolder8f2f0;\n\n            return isset($targetObject->$name);\n            return;\n        }\n\n        $targetObject = $this->valueHolder8f2f0;\n        $accessor = function () use ($targetObject, $name) {\n            return isset($targetObject->$name);\n        };\n        $backtrace = debug_backtrace(true);\n        $scopeObject = isset($backtrace[1]['object']) ? $backtrace[1]['object'] : new \\ProxyManager\\Stub\\EmptyClassStub();\n        $accessor = $accessor->bindTo($scopeObject, get_class($scopeObject));\n        $returnValue = $accessor();\n\n        return $returnValue;\n    }\n\n    public function __unset($name)\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, '__unset', array('name' => $name), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        $realInstanceReflection = new \\ReflectionClass(get_parent_class($this));\n\n        if (! $realInstanceReflection->hasProperty($name)) {\n            $targetObject = $this->valueHolder8f2f0;\n\n            unset($targetObject->$name);\n            return;\n        }\n\n        $targetObject = $this->valueHolder8f2f0;\n        $accessor = function () use ($targetObject, $name) {\n            unset($targetObject->$name);\n        };\n        $backtrace = debug_backtrace(true);\n        $scopeObject = isset($backtrace[1]['object']) ? $backtrace[1]['object'] : new \\ProxyManager\\Stub\\EmptyClassStub();\n        $accessor = $accessor->bindTo($scopeObject, get_class($scopeObject));\n        $returnValue = $accessor();\n\n        return $returnValue;\n    }\n\n    public function __clone()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, '__clone', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        $this->valueHolder8f2f0 = clone $this->valueHolder8f2f0;\n    }\n\n    public function __sleep()\n    {\n        $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, '__sleep', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n\n        return array('valueHolder8f2f0');\n    }\n\n    public function __wakeup()\n    {\n        \\Closure::bind(function (\\Doctrine\\ORM\\EntityManager $instance) {\n            unset($instance->config, $instance->conn, $instance->metadataFactory, $instance->unitOfWork, $instance->eventManager, $instance->proxyFactory, $instance->repositoryFactory, $instance->expressionBuilder, $instance->closed, $instance->filterCollection, $instance->cache);\n        }, $this, 'Doctrine\\\\ORM\\\\EntityManager')->__invoke($this);\n    }\n\n    public function setProxyInitializer(\\Closure $initializer = null)\n    {\n        $this->initializerd0fa7 = $initializer;\n    }\n\n    public function getProxyInitializer()\n    {\n        return $this->initializerd0fa7;\n    }\n\n    public function initializeProxy() : bool\n    {\n        return $this->initializerd0fa7 && ($this->initializerd0fa7->__invoke($valueHolder8f2f0, $this, 'initializeProxy', array(), $this->initializerd0fa7) || 1) && $this->valueHolder8f2f0 = $valueHolder8f2f0;\n    }\n\n    public function isProxyInitialized() : bool\n    {\n        return null !== $this->valueHolder8f2f0;\n    }\n\n    public function getWrappedValueHolderValue() : ?object\n    {\n        return $this->valueHolder8f2f0;\n    }\n\n\n}\n"
}

I can work around the issue by adding the following to my App\Kernel:

protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void
{
    // ...
    $container->setParameter('container.dumper.inline_class_loader', false);
}

@nicolas-grekas
Copy link
Member

Should be fixed by #33180, please give it a try if you can confirm.

@Devristo
Copy link
Contributor

I tried the PR, there seems to be a small issue. See the comment. In retrospect I think @derrabus and myself ran into a different issue.

@nicolas-grekas
Copy link
Member

@Devristo please open a separate issue as yours look unrelated as you hinted in #33180
Please provide a reproducer too if possible. Thanks.

nicolas-grekas added a commit that referenced this issue Aug 15, 2019
This PR was merged into the 3.4 branch.

Discussion
----------

[ProxyManager] fix closure binding

| Q             | A
| ------------- | ---
| Branch?       | 3.4
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #33037
| License       | MIT
| Doc PR        | -

Follows #32992

Commits
-------

31f9208 [ProxyManager] fix closure binding
@nicolas-grekas
Copy link
Member

nicolas-grekas commented Aug 15, 2019

@Devristo no need for a separate PR, the gist above fails, I was mislead by the original description which is about something else :)

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

No branches or pull requests

7 participants