public function InfoParserDynamic::parse in Drupal 8
Same name and namespace in other branches
- 9 core/lib/Drupal/Core/Extension/InfoParserDynamic.php \Drupal\Core\Extension\InfoParserDynamic::parse()
Parses Drupal module, theme and profile .info.yml files.
Info files are NOT for placing arbitrary theme and module-specific settings. Use Config::get() and Config::set()->save() for that. Info files are formatted as YAML. If the 'version' key is set to 'VERSION' in any info file, then the value will be substituted with the current version of Drupal core.
Information stored in all .info.yml files:
- name: The real name of the module for display purposes. (Required)
- description: A brief description of the module.
- type: whether it is for a module or theme. (Required)
Information stored in a module .info.yml file:
- dependencies: An array of dependency strings. Each is in the form
'project:module (versions)'; with the following meanings:
- project: (optional) Project shortname, recommended to ensure uniqueness, if the module is part of a project hosted on drupal.org. If omitted, also omit the : that follows. The project name is currently ignored by Drupal core but is used for automated testing.
- module: (required) Module shortname within the project.
- (versions): Version information, consisting of one or more comma-separated operator/value pairs or simply version numbers, which can contain "x" as a wildcard. Examples: (>=8.22, <8.28), (8.x-3.x).
- package: The name of the package of modules this module belongs to.
See forum.info.yml for an example of a module .info.yml file.
Information stored in a theme .info.yml file:
- screenshot: Path to screenshot relative to the theme's .info.yml file.
- engine: Theme engine; typically twig.
- base theme: Name of a base theme, if applicable.
- regions: Listed regions.
- features: Features available.
- stylesheets: Theme stylesheets.
- scripts: Theme scripts.
See bartik.info.yml for an example of a theme .info.yml file.
For information stored in a profile .info.yml file see install_profile_info().
Parameters
string $filename: The file we are parsing. Accepts file with relative or absolute path.
Return value
array The info array.
Throws
\Drupal\Core\Extension\InfoParserException Exception thrown if there is a parsing error or the .info.yml file does not contain a required key.
Overrides InfoParserInterface::parse
See also
1 call to InfoParserDynamic::parse()
- InfoParser::parse in core/
lib/ Drupal/ Core/ Extension/ InfoParser.php - Parses Drupal module, theme and profile .info.yml files.
1 method overrides InfoParserDynamic::parse()
- InfoParser::parse in core/
lib/ Drupal/ Core/ Extension/ InfoParser.php - Parses Drupal module, theme and profile .info.yml files.
File
- core/
lib/ Drupal/ Core/ Extension/ InfoParserDynamic.php, line 44
Class
- InfoParserDynamic
- Parses dynamic .info.yml files that might change during the page request.
Namespace
Drupal\Core\ExtensionCode
public function parse($filename) {
if (!file_exists($filename)) {
$parsed_info = [];
}
else {
try {
$parsed_info = Yaml::decode(file_get_contents($filename));
} catch (InvalidDataTypeException $e) {
throw new InfoParserException("Unable to parse {$filename} " . $e
->getMessage());
}
$missing_keys = array_diff($this
->getRequiredKeys(), array_keys($parsed_info));
if (!empty($missing_keys)) {
throw new InfoParserException('Missing required keys (' . implode(', ', $missing_keys) . ') in ' . $filename);
}
if (!isset($parsed_info['core']) && !isset($parsed_info['core_version_requirement'])) {
if (strpos($filename, 'core/') === 0 || strpos($filename, $this->root . '/core/') === 0) {
// Core extensions do not need to specify core compatibility: they are
// by definition compatible so a sensible default is used. Core
// modules are allowed to provide these for testing purposes.
$parsed_info['core_version_requirement'] = \Drupal::VERSION;
}
elseif (isset($parsed_info['package']) && $parsed_info['package'] === 'Testing') {
// Modules in the testing package are exempt as well. This makes it
// easier for contrib to use test modules.
$parsed_info['core_version_requirement'] = \Drupal::VERSION;
}
else {
// Non-core extensions must specify core compatibility.
throw new InfoParserException("The 'core' or the 'core_version_requirement' key must be present in " . $filename);
}
}
if (isset($parsed_info['core']) && !preg_match("/^\\d\\.x\$/", $parsed_info['core'])) {
throw new InfoParserException("Invalid 'core' value \"{$parsed_info['core']}\" in " . $filename);
}
if (isset($parsed_info['core_version_requirement'])) {
try {
$supports_pre_core_version_requirement_version = static::isConstraintSatisfiedByPreviousVersion($parsed_info['core_version_requirement'], static::FIRST_CORE_VERSION_REQUIREMENT_SUPPORTED_VERSION);
} catch (\UnexpectedValueException $e) {
throw new InfoParserException("The 'core_version_requirement' constraint ({$parsed_info['core_version_requirement']}) is not a valid value in {$filename}");
}
// If the 'core_version_requirement' constraint does not satisfy any
// Drupal 8 versions before 8.7.7 then 'core' cannot be set or it will
// effectively support all versions of Drupal 8 because
// 'core_version_requirement' will be ignored in previous versions.
if (!$supports_pre_core_version_requirement_version && isset($parsed_info['core'])) {
throw new InfoParserException("The 'core_version_requirement' constraint ({$parsed_info['core_version_requirement']}) requires the 'core' key not be set in " . $filename);
}
// 'core_version_requirement' can not be used to specify Drupal 8
// versions before 8.7.7 because these versions do not use the
// 'core_version_requirement' key. Do not throw the exception if the
// constraint also is satisfied by 8.0.0-alpha1 to allow constraints
// such as '^8' or '^8 || ^9'.
if ($supports_pre_core_version_requirement_version && !Semver::satisfies('8.0.0-alpha1', $parsed_info['core_version_requirement'])) {
throw new InfoParserException("The 'core_version_requirement' can not be used to specify compatibility for a specific version before " . static::FIRST_CORE_VERSION_REQUIREMENT_SUPPORTED_VERSION . " in {$filename}");
}
}
// Determine if the extension is compatible with the current version of
// Drupal core.
$core_version_constraint = isset($parsed_info['core_version_requirement']) ? $parsed_info['core_version_requirement'] : $parsed_info['core'];
$parsed_info['core_incompatible'] = !Semver::satisfies(\Drupal::VERSION, $core_version_constraint);
if (isset($parsed_info['version']) && $parsed_info['version'] === 'VERSION') {
$parsed_info['version'] = \Drupal::VERSION;
}
// Special backwards compatible handling profiles and their 'dependencies'
// key.
if ($parsed_info['type'] === 'profile' && isset($parsed_info['dependencies']) && !array_key_exists('install', $parsed_info)) {
// Only trigger the deprecation message if we are actually using the
// profile with the missing 'install' key. This avoids triggering the
// deprecation when scanning all the available install profiles.
global $install_state;
if (isset($install_state['parameters']['profile'])) {
$pattern = '@' . preg_quote(DIRECTORY_SEPARATOR . $install_state['parameters']['profile'] . '.info.yml') . '$@';
if (preg_match($pattern, $filename)) {
@trigger_error("The install profile {$filename} only implements a 'dependencies' key. As of Drupal 8.6.0 profile's support a new 'install' key for modules that should be installed but not depended on. See https://www.drupal.org/node/2952947.", E_USER_DEPRECATED);
}
}
// Move dependencies to install so that if a profile has both
// dependencies and install then dependencies are real.
$parsed_info['install'] = $parsed_info['dependencies'];
$parsed_info['dependencies'] = [];
}
}
return $parsed_info;
}