Skip to content

DI generates an invalid code. 'Undefined variable $containerRef' #50257

Closed
@marphi

Description

@marphi

Symfony version(s) affected

6.3.0-BETA2

Description

I tested the latest 6.3.0-BETA2 release on my project and found something worth to report.

I've got this warning during cache:clear
Warning: Undefined variable $containerRef

I suspect the issue is related to !tagged_iterator and factories.

How to reproduce

Example DI configuration in this case part of my SonataAdmin configuration.

   app_admin.widget_template:
        class: App\Bundle\AdminBundle\Admin\WidgetTemplateAdmin
        tags:
            - { name: sonata.admin, manager_type: orm, group: "Widgets", label: "Templates" }
        arguments:
            - ~
            - App\Component\WidgetTemplate\Entity\WidgetTemplateConfig
            - ~
        calls:
            - [ setTranslationDomain, [ AppAdminWidgetTemplate ] ]
            - [ setWidgetTypes, [ !tagged_iterator app.widget.template_type ]]

Generates invalid code:

<?php

namespace ContainerPq0jNwe;

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;

/**
 * @internal This class has been auto-generated by the Symfony Dependency Injection Component.
 */
class getAppAdmin_WidgetTemplateService extends App_KernelDevDebugContainer
{
    /**
     * Gets the private 'app_admin.widget_template' autowired service.
     *
     * @return \App\Bundle\AdminBundle\Admin\WidgetTemplateAdmin
     */
    public static function do($container, $lazyLoad = true)
    {
        $containerRef = $container->ref;

        include_once \dirname(__DIR__, 4).'/vendor/sonata-project/admin-bundle/src/Templating/MutableTemplateRegistryAwareInterface.php';
        include_once \dirname(__DIR__, 4).'/vendor/sonata-project/admin-bundle/src/DependencyInjection/Admin/TaggedAdminInterface.php';
        include_once \dirname(__DIR__, 4).'/vendor/sonata-project/admin-bundle/src/DependencyInjection/Admin/AbstractTaggedAdmin.php';
        include_once \dirname(__DIR__, 4).'/vendor/sonata-project/admin-bundle/src/Admin/AccessRegistryInterface.php';
        include_once \dirname(__DIR__, 4).'/vendor/sonata-project/admin-bundle/src/FieldDescription/FieldDescriptionRegistryInterface.php';
        include_once \dirname(__DIR__, 4).'/vendor/sonata-project/admin-bundle/src/Admin/LifecycleHookProviderInterface.php';
        include_once \dirname(__DIR__, 4).'/vendor/sonata-project/admin-bundle/src/Admin/ParentAdminInterface.php';
        include_once \dirname(__DIR__, 4).'/vendor/sonata-project/admin-bundle/src/Admin/UrlGeneratorInterface.php';
        include_once \dirname(__DIR__, 4).'/vendor/sonata-project/admin-bundle/src/Admin/AdminInterface.php';
        include_once \dirname(__DIR__, 4).'/vendor/symfony/security-acl/Model/DomainObjectInterface.php';
        include_once \dirname(__DIR__, 4).'/vendor/sonata-project/admin-bundle/src/Admin/AdminTreeInterface.php';
        include_once \dirname(__DIR__, 4).'/vendor/sonata-project/admin-bundle/src/Admin/AbstractAdmin.php';
        include_once \dirname(__DIR__, 4).'/src/App/Bundle/AdminBundle/Admin/Admin.php';
        include_once \dirname(__DIR__, 4).'/src/App/Bundle/AdminBundle/Admin/WidgetTemplateAdmin.php';
        include_once \dirname(__DIR__, 4).'/vendor/sonata-project/admin-bundle/src/Exporter/DataSourceInterface.php';
        include_once \dirname(__DIR__, 4).'/vendor/sonata-project/doctrine-orm-admin-bundle/src/Exporter/DataSource.php';
        include_once \dirname(__DIR__, 4).'/vendor/sonata-project/admin-bundle/src/Translator/LabelTranslatorStrategyInterface.php';
        include_once \dirname(__DIR__, 4).'/vendor/sonata-project/admin-bundle/src/Translator/NativeLabelTranslatorStrategy.php';

        $container->factories['service_container']['app_admin.widget_template'] = function ($container) {
            $instance = new \App\Bundle\AdminBundle\Admin\WidgetTemplateAdmin('app_admin.widget_template', 'App\\Component\\WidgetTemplate\\Entity\\WidgetTemplateConfig', 'sonata.admin.controller.crud');

            $instance->setManagerType('orm');
            $instance->setModelManager(($container->services['sonata.admin.manager.orm'] ?? $container->load('getSonata_Admin_Manager_OrmService')));
            $instance->setDataSource(($container->privates['sonata.admin.data_source.orm'] ??= new \Sonata\DoctrineORMAdminBundle\Exporter\DataSource()));
            $instance->setFieldDescriptionFactory(($container->privates['sonata.admin.field_description_factory.orm'] ?? $container->load('getSonata_Admin_FieldDescriptionFactory_OrmService')));
            $instance->setFormContractor(($container->privates['sonata.admin.builder.orm_form'] ?? $container->load('getSonata_Admin_Builder_OrmFormService')));
            $instance->setShowBuilder(($container->privates['sonata.admin.builder.orm_show'] ?? $container->load('getSonata_Admin_Builder_OrmShowService')));
            $instance->setListBuilder(($container->privates['sonata.admin.builder.orm_list'] ?? $container->load('getSonata_Admin_Builder_OrmListService')));
            $instance->setDatagridBuilder(($container->privates['sonata.admin.builder.orm_datagrid'] ?? $container->load('getSonata_Admin_Builder_OrmDatagridService')));
            $instance->setTranslator(($container->services['translator'] ?? self::getTranslatorService($container)), false);
            $instance->setConfigurationPool(($container->privates['sonata.admin.pool'] ?? self::getSonata_Admin_PoolService($container)));
            $instance->setRouteGenerator(($container->privates['sonata.admin.route.default_generator'] ?? $container->load('getSonata_Admin_Route_DefaultGeneratorService')));
            $instance->setSecurityHandler(($container->privates['sonata.admin.security.handler.role'] ?? $container->load('getSonata_Admin_Security_Handler_RoleService')));
            $instance->setMenuFactory(($container->services['knp_menu.factory'] ?? $container->load('getKnpMenu_FactoryService')));
            $instance->setRouteBuilder(($container->privates['sonata.admin.route.path_info'] ?? $container->load('getSonata_Admin_Route_PathInfoService')));
            $instance->setLabelTranslatorStrategy(($container->privates['sonata.admin.label.strategy.native'] ??= new \Sonata\AdminBundle\Translator\NativeLabelTranslatorStrategy()));
            $instance->setPagerType('default');
            $instance->setLabel('Templates');
            $instance->setTranslationDomain('messages');
            $instance->setListModes(['list' => ['icon' => '<i class="fas fa-list fa-fw" aria-hidden="true"></i>', 'class' => 'fas fa-list fa-fw'], 'mosaic' => ['icon' => '<i class="fas fa-th-large fa-fw" aria-hidden="true"></i>', 'class' => 'fas fa-th-large fa-fw']]);
            $instance->setSecurityInformation($container->parameters['sonata.admin.configuration.security.information']);
            $instance->setFormTheme(['@SonataDoctrineORMAdmin/Form/form_admin_fields.html.twig']);
            $instance->setFilterTheme(['@SonataDoctrineORMAdmin/Form/filter_admin_fields.html.twig']);
            $instance->setTranslationDomain('AppAdminWidgetTemplate');
            $instance->setWidgetTypes(new RewindableGenerator(function () use ($containerRef) {
                $container = $containerRef->get();

                yield 0 => ($container->privates['App\\Component\\WidgetTemplate\\Service\\WidgetType\\UserDetailsWidgetType'] ??= new \App\Component\WidgetTemplate\Service\WidgetType\UserDetailsWidgetType());
                yield 1 => ($container->privates['App\\Component\\WidgetTemplate\\Service\\WidgetType\\UserPhoneWidgetType'] ?? $container->load('getUserPhoneWidgetTypeService'));
                yield 2 => ($container->privates['App\\Component\\WidgetTemplate\\Service\\WidgetType\\UserPlaceWidgetType'] ??= new \App\Component\WidgetTemplate\Service\WidgetType\UserPlaceWidgetType());
                yield 3 => ($container->privates['App\\Component\\WidgetTemplate\\Service\\WidgetType\\UserPreferencesWidgetType'] ??= new \App\Component\WidgetTemplate\Service\WidgetType\UserPreferencesWidgetType());
                yield 4 => ($container->privates['App\\Component\\WidgetTemplate\\Service\\WidgetType\\UserProfileWidgetType'] ??= new \App\Component\WidgetTemplate\Service\WidgetType\UserProfileWidgetType());
            }, 5));
            $instance->setTemplateRegistry(($container->services['app_admin.widget_template.template_registry'] ?? $container->load('getAppAdmin_WidgetTemplate_TemplateRegistryService')));
            $instance->addExtension(($container->privates['sonata.admin.event.extension'] ?? $container->load('getSonata_Admin_Event_ExtensionService')));
            $instance->addExtension(($container->privates['app_admin.user_task_extra_extension'] ?? $container->load('getAppAdmin_UserTaskExtraExtensionService')));
            $instance->initialize();

            return $instance;
        };

        return $container->factories['service_container']['app_admin.widget_template']($container);
    }
}

Take a look at line:

            $instance->setWidgetTypes(new RewindableGenerator(function () use ($containerRef) {

$containerRef this variable exists, but the code is located in into anonymous function where origin variable $containerRef is not accessible.

Possible Solution

I'm not sure and not have enough knowledge about internal DI matters. I suppose PhpDumper have an issue and needs to rewrite:

from:


                    $code = [];
                    $code[] = 'new RewindableGenerator(function () use ($containerRef) {';
                    $code[] = '            $container = $containerRef->get();';
                    $code[] = '';

to:


                    $code = [];
                    $code[] = 'new RewindableGenerator(function () use ($container) {';
                    $code[] = '';

But will it always work?

Additional Context

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions