Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
33.33% covered (danger)
33.33%
1 / 3
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
ComposerAutoloadGenerator
33.33% covered (danger)
33.33%
1 / 3
50.00% covered (danger)
50.00%
1 / 2
3.19
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 getFileIdentifier
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2/**
3 * Extend Composer's `AutoloadGenerator` to override the `getFileIdentifier()` method's hash to provide true uniqueness.
4 *
5 * `files` autoloaders' entries in `composer/autoload_static.php` and `composer/autoload_files.php` are given
6 * a `fileIdentifier` that is a hash of the package name and path. It is used in
7 * `$GLOBALS['__composer_autoload_files'][$fileIdentifier]` to ensure that the file is only `require`d once.
8 *
9 * It does not use the contents of the file in the hash. When two projects include the same package, that package's
10 * files' identifiers will be the same in both.
11 *
12 * This subclass overrides the `getFileIdentifier()` method to include a unique string for the project, presumably
13 * the `namespace_prefix`.
14 *
15 * {@see DumpAutoload::generatedPrefixedAutoloader()} calls {@see AutoloadGenerator::dump()} which eventually calls
16 * {@see AutoloadGenerator::getFileIdentifier()} which is used in {@see AutoloadGenerator::getIncludeFilesFile()} to
17 * generate `autoload_files.php` which is loaded in {@see AutoloadGenerator::getStaticFilesFile()} to create
18 * `autoload_static.php`.
19 */
20
21namespace BrianHenryIE\Strauss\Pipeline\Autoload;
22
23use Composer\Autoload\AutoloadGenerator;
24use Composer\EventDispatcher\EventDispatcher;
25use Composer\IO\IOInterface;
26use Composer\Package\PackageInterface;
27
28class ComposerAutoloadGenerator extends AutoloadGenerator
29{
30    /**
31     * A string to include in the fileIdentifier hash to ensure it is unique across projects.
32     */
33    protected string $projectUniqueString;
34
35    /**
36     * Constructor
37     *
38     * @param string $projectUniqueString A string to include in the hash to ensure uniqueness across projects, probably `namespace_prefix`.
39     * @param EventDispatcher $eventDispatcher Used to dispatch `optimize` script when {@see AutoloadGenerator::$runScripts} is true, which defaults to `false`.
40     * @param IOInterface|null $io Used to write errors and warnings. Default `null`.
41     */
42    public function __construct(
43        string $projectUniqueString,
44        EventDispatcher $eventDispatcher,
45        ?IOInterface $io = null
46    ) {
47        parent::__construct($eventDispatcher, $io);
48
49        $this->projectUniqueString = $projectUniqueString;
50    }
51
52    /**
53     * Get a unique id for the `files` autoload entry.
54     *
55     * `$path` here is `PackageInterface->getTargetDir()`.`PackageInterface::getAutoload()['files'][]`
56     *
57     * @override
58     * @see AutoloadGenerator::getFileIdentifier()
59     *
60     * @param PackageInterface $package The package to get the file identifier for.
61     * @param string $path Relative path from `vendor`.
62     *
63     * @return string
64     */
65    protected function getFileIdentifier(PackageInterface $package, string $path)
66    {
67        return hash('md5', $package->getName() . ':' . $path . ':' . $this->projectUniqueString);
68    }
69}