Closed
Description
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