classResourceLoader
final class ResourceLoader
Public API: explicitly declared with
@visibility public.Reads source documents from HTTP(S) URLs or local paths, with pinned snapshots.
Reads are limited to 16 MiB and remembered per URI, failures included. A missing local snapshot is fetched from the source URI, verified against the digest and cached; a document whose digest differs is rejected.
$directory = sys_get_temp_dir() . '/requirements-example-' . bin2hex(random_bytes(4));
mkdir($directory);
file_put_contents($directory . '/notes.txt', 'Names start with a letter.');
(new \Requirements\Source\ResourceLoader())->read(new \Requirements\Model\Source('notes', 'notes.txt', 'text', 'lines:1'), $directory, false) // => 'Names start with a letter.'$directory = sys_get_temp_dir() . '/requirements-example-' . bin2hex(random_bytes(4));
mkdir($directory);
file_put_contents($directory . '/notes.txt', 'Names start with a digit.');
(new \Requirements\Source\ResourceLoader())->read(new \Requirements\Model\Source('notes', 'notes.txt', 'text', 'lines:1', sha256: hash('sha256', 'Names start with a letter.')), $directory, false) // throws \RuntimeException: SHA-256 mismatchMethods§
public function __construct(private HttpClientInterface|null $client = null)Parameters
$client | HttpClientInterface|null | The client for HTTP(S) sources; a default client when null |
public function read(Source $source, string $directory, bool $live): stringReads the document of a source.
Parameters
$source | Source | The source declaration |
$directory | string | The configuration directory that relative paths resolve against |
$live | bool | Whether to read the source URI instead of its pinned snapshot |
Returns
string The documentThrows
RuntimeException When the document cannot be read, exceeds the limit or its digest differsTest cases 17
ResourceLoaderTest::testReadAcceptsAMatchingDigestcallsResourceLoaderTest::testReadCachesAMissingSnapshotVerbatimcallsResourceLoaderTest::testReadDownloadsAMissingSnapshotOncecallsResourceLoaderTest::testReadHttpContentIsBoundedAndFailuresAreNotRepeatedcallsResourceLoaderTest::testReadHttpContentIsCachedWithinTheCommandcallsResourceLoaderTest::testReadHttpErrorCannotBecomeValidEvidencecallsResourceLoaderTest::testReadLiveModeBypassesPinnedSnapshotAndDetectsCurrentTextcallsResourceLoaderTest::testReadLiveStillVerifiesASourceWithoutSnapshotcallsResourceLoaderTest::testReadMissingSnapshotIsFetchedAndVerifiedBeforeCachingcallsResourceLoaderTest::testReadPrefersAnExistingSnapshotOverTheUricallsResourceLoaderTest::testReadRejectsAChangedSnapshotcallsResourceLoaderTest::testReadRejectsADifferentDigestcallsResourceLoaderTest::testReadRejectsAnUnverifiedDownloadcallsResourceLoaderTest::testReadRejectsOtherSchemescallsResourceLoaderTest::testReadRemoteSnapshotIsNeverCachedLocallycallsResourceLoaderTest::testReadResolvesPathsAgainstTheDirectorycallsResourceLoaderTest::testReadUnverifiedDownloadIsNeverCachedcalls
Called from 4
- method-call Requirements\Source\DomSource::select() packages/requirements/src/Source/DomSource.php:52
- method-call Requirements\Source\JsonSource::select() packages/requirements/src/Source/JsonSource.php:43
- method-call Requirements\Source\ResourceLoader::read() packages/requirements/src/Source/ResourceLoader.php:67
- method-call Requirements\Source\TextSource::select() packages/requirements/src/Source/TextSource.php:43
Calls 12
- method-call ResourceLocation::resolve() line 65
- new ResourceLocation line 65
- function-call
str_containsline 66 - function-call
is_fileline 66 - method-call SnapshotCache::write() line 67
- new SnapshotCache line 67
- method-call ResourceLoader::read() line 67
- new Source line 67
- method-call ResourceLoader::fetch() line 69
- function-call
hash_equalsline 70 - function-call
hashline 70 - new
RuntimeExceptionline 71
public function fetch(string $uri): stringReads a resolved URI once and remembers the document or the failure.
Parameters
$uri | string | An HTTP(S) URL or an absolute local path |
Returns
string The documentThrows
RuntimeException When the resource cannot be read or exceeds 16 MiBTest cases 8
DomSourceTest::testSelectReadsThroughTheGivenLoadercallsJsonSourceTest::testSelectReadsThroughTheGivenLoadercallsResourceLoaderTest::testFetchNamesTheUnreadableResourcecallsResourceLoaderTest::testFetchRemembersTheDocumentcallsResourceLoaderTest::testFetchRemembersTheFailurecallsResourceLoaderTest::testFetchWrapsClientFailurescallsResourceLoaderTest::testFetchWrapsTransportFailurescallsTextSourceTest::testSelectReadsThroughTheGivenLoadercalls
Called from 1
Calls 6
- function-call
str_containsline 92 - method-call Download::get() line 92
- new Download line 92
- method-call LocalFile::read() line 92
- new LocalFile line 92
- new
RuntimeExceptionline 95
Private surface 3§
Implementation details, listed for orientation only.
private array<string, string> $cache = []private array<string, RuntimeException> $failures = []private HttpClientInterface|null $client = nullTest cases 40§
Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.
Dedicated tests 22
ResourceLoaderTest::testFetchNamesTheUnreadableResourcecallsResourceLoaderTest::testFetchRemembersTheDocumentcallsResourceLoaderTest::testFetchRemembersTheFailurecallsResourceLoaderTest::testFetchWrapsClientFailurescallsResourceLoaderTest::testFetchWrapsTransportFailurescallsResourceLoaderTest::testReadAcceptsAMatchingDigestcallsResourceLoaderTest::testReadCachesAMissingSnapshotVerbatimcallsResourceLoaderTest::testReadDownloadsAMissingSnapshotOncecallsResourceLoaderTest::testReadHttpContentIsBoundedAndFailuresAreNotRepeatedcallsResourceLoaderTest::testReadHttpContentIsCachedWithinTheCommandcallsResourceLoaderTest::testReadHttpErrorCannotBecomeValidEvidencecallsResourceLoaderTest::testReadLiveModeBypassesPinnedSnapshotAndDetectsCurrentTextcallsResourceLoaderTest::testReadLiveStillVerifiesASourceWithoutSnapshotcallsResourceLoaderTest::testReadMissingSnapshotIsFetchedAndVerifiedBeforeCachingcallsResourceLoaderTest::testReadPrefersAnExistingSnapshotOverTheUricallsResourceLoaderTest::testReadRejectsAChangedSnapshotcallsResourceLoaderTest::testReadRejectsADifferentDigestcallsResourceLoaderTest::testReadRejectsAnUnverifiedDownloadcallsResourceLoaderTest::testReadRejectsOtherSchemescallsResourceLoaderTest::testReadRemoteSnapshotIsNeverCachedLocallycallsResourceLoaderTest::testReadResolvesPathsAgainstTheDirectorycallsResourceLoaderTest::testReadUnverifiedDownloadIsNeverCachedcalls
Other tests reaching this symbol 18
ExtensionCommandTestcallsLoaderTestcallsMarkdownDocumentTestcallsApplicationTestcallsCommandHandlerTestcallsCommandLineTestcallsExecutorTestcallsFormatterTestcallsAnalyzerTestcallsCoverageTestcallsEvidenceMatcherTestcallsSnapshotTestcallsDomSourceTest::testSelectReadsThroughTheGivenLoadercallsJsonSourceTest::testSelectReadsThroughTheGivenLoadercallsRegistryTestcallsSourceExtensionTestcallsTextSourceTest::testSelectReadsThroughTheGivenLoadercallsVerifierTestcalls
Relations§
Instantiated in 4
- new Requirements\Source\DomSource::__construct() packages/requirements/src/Source/DomSource.php:28
- new Requirements\Source\JsonSource::__construct() packages/requirements/src/Source/JsonSource.php:23
- new Requirements\Source\Registry::__construct() packages/requirements/src/Source/Registry.php:29
- new Requirements\Source\TextSource::__construct() packages/requirements/src/Source/TextSource.php:19
Method calls 3
- method-call Requirements\Source\DomSource::select() packages/requirements/src/Source/DomSource.php:52
- method-call Requirements\Source\JsonSource::select() packages/requirements/src/Source/JsonSource.php:43
- method-call Requirements\Source\TextSource::select() packages/requirements/src/Source/TextSource.php:43