Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. PhpDumper.php

function PhpDumper::startClass

1 call to PhpDumper::startClass()
PhpDumper::dump in vendor/symfony/dependency-injection/Dumper/PhpDumper.php
Dumps the service container as a PHP class.

File

vendor/symfony/dependency-injection/Dumper/PhpDumper.php, line 1237

Class

PhpDumper
PhpDumper dumps a service container as a PHP class.

Namespace

Symfony\Component\DependencyInjection\Dumper

Code

private function startClass(string $class, string $baseClass, bool $hasProxyClasses) : string {
    $namespaceLine = !$this->asFiles && $this->namespace ? "\nnamespace {$this->namespace};\n" : '';
    $code = <<<EOF
<?php
{<span class="php-variable">$namespaceLine</span>}
use Symfony\\Component\\DependencyInjection\\Argument\\RewindableGenerator;
use Symfony\\Component\\DependencyInjection\\ContainerInterface;
use Symfony\\Component\\DependencyInjection\\Container;
use Symfony\\Component\\DependencyInjection\\Exception\\LogicException;
use Symfony\\Component\\DependencyInjection\\Exception\\ParameterNotFoundException;
use Symfony\\Component\\DependencyInjection\\Exception\\RuntimeException;
use Symfony\\Component\\DependencyInjection\\ParameterBag\\FrozenParameterBag;
use Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface;

/*{<span class="php-variable">$this</span>-&gt;<span class="php-function-or-constant property member-of-self">docStar</span>}
 * @internal This class has been auto-generated by the Symfony Dependency Injection Component.
 */
class {<span class="php-variable">$class</span>} extends {<span class="php-variable">$baseClass</span>}
{
    private const DEPRECATED_PARAMETERS = [];

    private const NONEMPTY_PARAMETERS = [];

    protected \$parameters = [];

    public function __construct()
    {

EOF;
    $code = str_replace("    private const DEPRECATED_PARAMETERS = [];\n\n", $this->addDeprecatedParameters(), $code);
    $code = str_replace("    private const NONEMPTY_PARAMETERS = [];\n\n", $this->addNonEmptyParameters(), $code);
    if ($this->asFiles) {
        $code = str_replace('__construct()', '__construct(private array $buildParameters = [], protected string $containerDir = __DIR__)', $code);
        if (null !== $this->targetDirRegex) {
            $code = str_replace('$parameters = []', "\$targetDir;\n    protected \$parameters = []", $code);
            $code .= '        $this->targetDir = \\dirname($containerDir);' . "\n";
        }
    }
    if (Container::class !== $this->baseClass) {
        $r = $this->container
            ->getReflectionClass($this->baseClass, false);
        if (null !== $r && null !== ($constructor = $r->getConstructor()) && 0 === $constructor->getNumberOfRequiredParameters() && Container::class !== $constructor->getDeclaringClass()->name) {
            $code .= "        parent::__construct();\n";
            $code .= "        \$this->parameterBag = null;\n\n";
        }
    }
    if ($this->container
        ->getParameterBag()
        ->all()) {
        $code .= "        \$this->parameters = \$this->getDefaultParameters();\n\n";
    }
    $code .= "        \$this->services = \$this->privates = [];\n";
    $code .= $this->addSyntheticIds();
    $code .= $this->addMethodMap();
    $code .= $this->asFiles && !$this->inlineFactories ? $this->addFileMap() : '';
    $code .= $this->addAliases();
    $code .= $this->addInlineRequires($hasProxyClasses);
    $code .= <<<EOF
    }

    public function compile(): void
    {
        throw new LogicException('You cannot compile a dumped container that was already compiled.');
    }

    public function isCompiled(): bool
    {
        return true;
    }

EOF;
    $code .= $this->addRemovedIds();
    if ($this->asFiles && !$this->inlineFactories) {
        $code .= <<<'EOF'

    protected function load($file, $lazyLoad = true): mixed
    {
        if (class_exists($class = __NAMESPACE__.'\\'.$file, false)) {
            return $class::do($this, $lazyLoad);
        }

        if ('.' === $file[-4]) {
            $class = substr($class, 0, -4);
        } else {
            $file .= '.php';
        }

        $service = require $this->containerDir.\DIRECTORY_SEPARATOR.$file;

        return class_exists($class, false) ? $class::do($this, $lazyLoad) : $service;
    }

EOF;
    }
    foreach ($this->container
        ->getDefinitions() as $definition) {
        if (!$definition->isLazy() || !$this->hasProxyDumper) {
            continue;
        }
        if ($this->asFiles && !$this->inlineFactories) {
            $proxyLoader = "class_exists(\$class, false) || require __DIR__.'/'.\$class.'.php';\n\n        ";
        }
        else {
            $proxyLoader = '';
        }
        $code .= <<<EOF

    protected function createProxy(\$class, \\Closure \$factory)
    {
        {<span class="php-variable">$proxyLoader</span>}return \$factory();
    }

EOF;
        break;
    }
    return $code;
}
RSS feed
Powered by Drupal