Skip to content

Wrong “exclude” list in services causes a PHP exception to FileLoader #46833

@alexislefebvre

Description

@alexislefebvre

Symfony version(s) affected

4.4, 5.4 and 6.2

Description

I ran composer recipes:update symfony/framework-bundle and fixed the conflicts.

Then I wasn't able to run the console or browse the web version, I got this exception:

Argument 1 passed to Symfony\Component\Config\Loader\FileLoader::glob() must be of the type string, null given, called in /app/vendor/symfony/dependency-injection/Loader/FileLoader.php on line 180

Full stack trace

TypeError {#223
  #message: "Argument 1 passed to Symfony\Component\Config\Loader\FileLoader::glob() must be of the type string, null given, called in /dev/shm/symfony-fileloader/vendor/symfony/dependency-injection/Loader/FileLoader.php on line 180"
  #code: 0
  #file: "/dev/shm/symfony-fileloader/vendor/symfony/config/Loader/FileLoader.php"
  #line: 104
  trace: {
    /dev/shm/symfony-fileloader/vendor/symfony/config/Loader/FileLoader.php:104 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/dependency-injection/Loader/FileLoader.php:180 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/dependency-injection/Loader/FileLoader.php:105 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php:699 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php:256 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php:176 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php:132 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/config/Loader/FileLoader.php:159 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/config/Loader/FileLoader.php:98 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/dependency-injection/Loader/FileLoader.php:66 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php:64 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/framework-bundle/Kernel/MicroKernelTrait.php:58 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/framework-bundle/Kernel/MicroKernelTrait.php:188 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/dependency-injection/Loader/ClosureLoader.php:39 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/config/Loader/DelegatingLoader.php:40 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/framework-bundle/Kernel/MicroKernelTrait.php:196 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/http-kernel/Kernel.php:649 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/http-kernel/Kernel.php:545 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/http-kernel/Kernel.php:787 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/http-kernel/Kernel.php:128 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/framework-bundle/Console/Application.php:168 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/framework-bundle/Console/Application.php:74 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/console/Application.php:171 { …}
    /dev/shm/symfony-fileloader/vendor/symfony/runtime/Runner/Symfony/ConsoleApplicationRunner.php:54 { …}
    /dev/shm/symfony-fileloader/vendor/autoload_runtime.php:35 { …}
    /dev/shm/symfony-fileloader/bin/console:11 {
      › 
      › require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
      › 
      arguments: {
        "/dev/shm/symfony-fileloader/vendor/autoload_runtime.php"
      }
    }
  }
}

By showing the content of the exclusion list, I was able to see the mistake:

services:
    App\:
        resource: '../src/'
        exclude:
            - '../src/DependencyInjection/'
            - '../src/Entity/'
            - '../src/Kernel.php'
            -

I probably messed up with my IDE when resolving conflicts, this is a valid YAML syntax but it breaks the file loader.

How to reproduce

  1. create a project:

    • 6.2: composer create-project symfony/skeleton symfony-fileloader-6.2 ; cd symfony-fileloader-6.2
    • 5.4: composer create-project symfony/skeleton symfony-fileloader-5.4 "^5.4" ; cd symfony-fileloader-5.4
    • 4.4: composer create-project symfony/skeleton symfony-fileloader-4.4 "^4.4" ; cd symfony-fileloader-4.4
  2. add the following line in the exclude list in config/services.yaml

                -
  3. run bin/console --version, it breaks!

Possible Solution

Ignore non-string values on this line:

foreach ($this->glob($excludePattern, true, $resource, true, true) as $path => $info) {

So that glob only receive a string as the first argument.

Or it may be an issue with the YAML loader: should a - node be ignored?

Of if an empty node has no practical usage in the configuration of Symfony, it may show an error.

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