class PhpExtensionsValidator

Performs validation if certain PHP extensions are enabled.

@internal This is an internal part of Package Manager and may be changed or removed at any time without warning. External code should not interact with this class.

Hierarchy

Expanded class hierarchy of PhpExtensionsValidator

File

core/modules/package_manager/src/Validator/PhpExtensionsValidator.php, line 23

Namespace

Drupal\package_manager\Validator
View source
class PhpExtensionsValidator implements EventSubscriberInterface {
    use StringTranslationTrait;
    
    /**
     * Indicates if a particular PHP extension is loaded.
     *
     * @param string $name
     *   The name of the PHP extension to check for.
     *
     * @return bool
     *   TRUE if the given extension is loaded, FALSE otherwise.
     */
    protected final function isExtensionLoaded(string $name) : bool {
        // If and ONLY if we're currently running a test, allow the list of loaded
        // extensions to be overridden by a state variable.
        if (self::insideTest()) {
            // By default, assume OpenSSL is enabled and Xdebug isn't. This allows us
            // to run tests in environments that we might not support in production,
            // such as Drupal CI.
            $loaded_extensions = \Drupal::state()->get('package_manager_loaded_php_extensions', [
                'openssl',
            ]);
            return in_array($name, $loaded_extensions, TRUE);
        }
        return extension_loaded($name);
    }
    
    /**
     * Flags a warning if Xdebug is enabled.
     *
     * @param \Drupal\package_manager\Event\StatusCheckEvent $event
     *   The event object.
     */
    public function validateXdebug(StatusCheckEvent $event) : void {
        if ($this->isExtensionLoaded('xdebug')) {
            $event->addWarning([
                $this->t('Xdebug is enabled, which may have a negative performance impact on Package Manager and any modules that use it.'),
            ]);
        }
    }
    
    /**
     * Flags an error if the OpenSSL extension is not installed.
     *
     * @param \Drupal\package_manager\Event\PreOperationStageEvent $event
     *   The event object.
     */
    public function validateOpenSsl(PreOperationStageEvent $event) : void {
        if (!$this->isExtensionLoaded('openssl')) {
            $message = $this->t('The OpenSSL extension is not enabled, which is a security risk. See <a href=":url">the PHP documentation</a> for information on how to enable this extension.', [
                ':url' => 'https://www.php.net/manual/en/openssl.installation.php',
            ]);
            $event->addError([
                $message,
            ]);
        }
    }
    
    /**
     * Whether this validator is running inside a test.
     *
     * @return bool
     */
    private static function insideTest() : bool {
        // @see \Drupal\Core\CoreServiceProvider::registerTest()
        $in_functional_test = drupal_valid_test_ua();
        // @see \Drupal\Core\DependencyInjection\DependencySerializationTrait::__wakeup()
        $in_kernel_test = isset($GLOBALS['__PHPUNIT_BOOTSTRAP']);
        // @see \Drupal\BuildTests\Framework\BuildTestBase::setUp()
        $in_build_test = str_contains(__FILE__, DrupalFilesystem::getOsTemporaryDirectory() . '/build_workspace_');
        return $in_functional_test || $in_kernel_test || $in_build_test;
    }
    
    /**
     * {@inheritdoc}
     */
    public static function getSubscribedEvents() : array {
        return [
            StatusCheckEvent::class => [
                [
                    'validateXdebug',
                ],
                [
                    'validateOpenSsl',
                ],
            ],
            PreCreateEvent::class => [
                'validateOpenSsl',
            ],
            PreApplyEvent::class => [
                'validateOpenSsl',
            ],
        ];
    }

}

Members

Title Sort descending Modifiers Object type Summary Overrides
PhpExtensionsValidator::getSubscribedEvents public static function
PhpExtensionsValidator::insideTest private static function Whether this validator is running inside a test.
PhpExtensionsValidator::isExtensionLoaded final protected function Indicates if a particular PHP extension is loaded.
PhpExtensionsValidator::validateOpenSsl public function Flags an error if the OpenSSL extension is not installed.
PhpExtensionsValidator::validateXdebug public function Flags a warning if Xdebug is enabled.
StringTranslationTrait::$stringTranslation protected property The string translation service. 3
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.