symfony 3, аргументы не могут быть переданы в сервисы (используются setArguments)

Усовершенствованный:

Я сделал то же самое в AppBundle(автоматический сгенерированный), все работает хорошо, и в скомпилированной версии (в var/cache/dev/appDevDebugProjectContainer.php)параметры были переданы следующим образом

return $this->services['app.roles'] = new AppBundleRoleRolesProvider(array(0 => 'ROLE_SUPER', 1 => 'ROLE_ADMIN', 2 => 'ROLE_USER'));

но в моем сгенерированном пакете ни один параметр не был передан.


m создание приложения с помощью symfony (версия 3.1.6), застрял.. любая помощь была оценена.

Детали как следовать:

1.создание пакета с помощью «Symfony console tool» (не выбрано повторно)

2.создайте класс обслуживания, как показано ниже.

class RolesProvider(){
        public function __construct(array $roles){
            //...
        }
}

сервисы.yml:

services:
    user.roles.provider:
        class: UserBundleRoleRolesProvider

3.мой класс расширения :

class UserExtension extends Extension {
    public function load(array $configs, ContainerBuilder $container) {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
        $loader->load('services.yml');

        $rolesProviderDef = $container->getDefinition('user.roles.provider');

        $rolesProviderDef->setArguments([
            $config['roles']
        ]);
    }
}

4.мой класс конфигурации

class Configuration implements ConfigurationInterface{
    public function getConfigTreeBuilder() {
        $treeBuilder = new TreeBuilder;
        $rootNode = $treeBuilder->root('user');
        $rootNode->children()
                ->arrayNode('roles')
                    ->prototype('scalar')->end()
                ->end();

        return $treeBuilder;
    }
}

5.конфиг.yml:

user:
    roles: ["ROLE_SUPER", "ROLE_ADMIN", "ROLE_USER"]

Когда я звонил$this->get('user.roles.provider'), он всегда дает мне ошибку:

Ошибка типа: Аргумент 1 передается
UserBundleRoleRolesProvider::_ _ construct() должен иметь тип
массив, не задан,

пропустил ли я какие-то настройки?

Усовершенствованный———:

я сбросил переменную $config и $rolesProviderDef в классе расширения и получил это

$конфигурация

array(1) {
 ["roles"]=>
 array(3) {
   [0]=>
   string(10) "ROLE_SUPER"
   [1]=>
   string(10) "ROLE_ADMIN"
   [2]=>
   string(9) "ROLE_USER"
 }
}

некоторый код $rolesProviderDef:

//...
["arguments":protected]=>
  array(1) {
    [0]=>
    array(3) {
      [0]=>
      string(10) "ROLE_SUPER"
      [1]=>
      string(10) "ROLE_ADMIN"
      [2]=>
      string(9) "ROLE_USER"
    }
  }

//...

1 ответ

  1. Definition::setArguments() принимает массив всех аргументов. Передача a $config['roles']генерирует что-то вроде этого i:

    // somewhere in the compiled container:
    new RolesProvider("ROLE_SUPER", "ROLE_ADMIN", "ROLE_USER");
    

    Я не уверен, что это проблема, потому что это должно вызвать другую ошибку типа. Но может ли это привести к неправильной генерации кода (?)
    Попробовать это:

    // note the additional brackets
    $rolesProviderDef->setArguments([$config['roles']]); 
    
    // or
    
    // set only first one argument
    $rolesProviderDef->replaceArgument(0, $config['roles']);