2006-12-12 06:27:17 +00:00
< ? php
2016-09-19 10:39:40 +00:00
2014-04-16 22:49:23 +00:00
/**
* @ file
* Functions that need to be loaded on every Drupal request .
*/
2003-11-18 19:44:36 +00:00
2013-05-02 04:46:53 +00:00
use Drupal\Component\Utility\Crypt ;
2021-08-03 15:51:34 +00:00
use Drupal\Core\Http\InputBag ;
2014-10-14 08:43:11 +00:00
use Drupal\Core\Logger\RfcLogLevel ;
2016-09-16 10:35:51 +00:00
use Drupal\Core\Test\TestDatabase ;
2014-01-09 11:50:54 +00:00
use Drupal\Core\Utility\Error ;
2016-02-23 07:03:02 +00:00
use Drupal\Core\StringTranslation\TranslatableMarkup ;
Issue #2659940 by almaudoh, alexpott, phenaproxima, Jo Fitzgerald, markcarver, oriol_e9g, dawehner, dsnopek, jibran, larowlan: Extension System, Part III: ThemeExtensionList and ThemeEngineExtensionList
2018-11-29 12:15:17 +00:00
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException ;
2021-08-03 15:51:34 +00:00
use Symfony\Component\HttpFoundation\Request ;
use Symfony\Component\HttpFoundation\InputBag as SymfonyInputBag ;
2012-01-13 14:14:07 +00:00
2009-10-30 22:33:35 +00:00
/**
Issue #2908079 by jungle, voleger, mpdonadio, zahord, andypost, RoSk0, Mile23, claudiu.cristea, alexpott, xjm, Krzysztof Domański, naveenvalecha, piggito, Suresh Prabhu Parkala, daffie, dawehner, gumanist: Move some of the bootstrap.inc PHP-related constants to \Drupal and deprecate the old versions
2020-06-21 18:55:29 +00:00
* Minimum allowed version of PHP for Drupal to be bootstrapped .
2019-03-29 07:19:57 +00:00
*
* Below this version :
* - The installer cannot be run .
* - Updates cannot be run .
* - Modules and themes cannot be enabled .
* - If a site managed to bypass all of the above , then an error is shown in
* the status report and various fatal errors occur on various pages .
Issue #2670966 by xjm, Crell, claudiu.cristea, alexpott, timmillwood, rakesh.gectcr, catch, dawehner, David_Rothstein, hchonov, martin107, tstoeckler, andypost, cilefen, RobLoach, Fabianx, salvis, hussainweb, JeroenT, larowlan, pfrenssen, daffie, webchick, wturrell: Warn users of old PHP versions
2017-12-03 05:03:36 +00:00
*
Issue #2908079 by jungle, voleger, mpdonadio, zahord, andypost, RoSk0, Mile23, claudiu.cristea, alexpott, xjm, Krzysztof Domański, naveenvalecha, piggito, Suresh Prabhu Parkala, daffie, dawehner, gumanist: Move some of the bootstrap.inc PHP-related constants to \Drupal and deprecate the old versions
2020-06-21 18:55:29 +00:00
* @ deprecated in drupal : 9.1 . 0 and is removed from drupal : 10.0 . 0. Use
* \Drupal :: MINIMUM_PHP instead .
2018-02-01 11:37:06 +00:00
*
Issue #2908079 by jungle, voleger, mpdonadio, zahord, andypost, RoSk0, Mile23, claudiu.cristea, alexpott, xjm, Krzysztof Domański, naveenvalecha, piggito, Suresh Prabhu Parkala, daffie, dawehner, gumanist: Move some of the bootstrap.inc PHP-related constants to \Drupal and deprecate the old versions
2020-06-21 18:55:29 +00:00
* @ see https :// www . drupal . org / node / 2909361
* @ see install . php
2014-10-07 22:14:37 +00:00
*/
Issue #2908079 by jungle, voleger, mpdonadio, zahord, andypost, RoSk0, Mile23, claudiu.cristea, alexpott, xjm, Krzysztof Domański, naveenvalecha, piggito, Suresh Prabhu Parkala, daffie, dawehner, gumanist: Move some of the bootstrap.inc PHP-related constants to \Drupal and deprecate the old versions
2020-06-21 18:55:29 +00:00
const DRUPAL_MINIMUM_PHP = \Drupal :: MINIMUM_PHP ;
2009-10-30 22:33:35 +00:00
2019-03-29 07:19:57 +00:00
/**
* Minimum supported version of PHP .
*
* Below this version :
* - New sites cannot be installed , except from within tests .
* - Updates from previous Drupal versions can be run , but users are warned
* that Drupal no longer supports that PHP version .
* - An error is shown in the status report that the PHP version is too old .
*
Issue #2908079 by jungle, voleger, mpdonadio, zahord, andypost, RoSk0, Mile23, claudiu.cristea, alexpott, xjm, Krzysztof Domański, naveenvalecha, piggito, Suresh Prabhu Parkala, daffie, dawehner, gumanist: Move some of the bootstrap.inc PHP-related constants to \Drupal and deprecate the old versions
2020-06-21 18:55:29 +00:00
* @ deprecated in drupal : 9.1 . 0 and is removed from drupal : 10.0 . 0. Use
2022-05-27 16:10:53 +00:00
* \Drupal :: MINIMUM_SUPPORTED_PHP instead .
Issue #2908079 by jungle, voleger, mpdonadio, zahord, andypost, RoSk0, Mile23, claudiu.cristea, alexpott, xjm, Krzysztof Domański, naveenvalecha, piggito, Suresh Prabhu Parkala, daffie, dawehner, gumanist: Move some of the bootstrap.inc PHP-related constants to \Drupal and deprecate the old versions
2020-06-21 18:55:29 +00:00
*
* @ see https :// www . drupal . org / node / 2909361
2019-03-29 07:19:57 +00:00
*/
Issue #2908079 by jungle, voleger, mpdonadio, zahord, andypost, RoSk0, Mile23, claudiu.cristea, alexpott, xjm, Krzysztof Domański, naveenvalecha, piggito, Suresh Prabhu Parkala, daffie, dawehner, gumanist: Move some of the bootstrap.inc PHP-related constants to \Drupal and deprecate the old versions
2020-06-21 18:55:29 +00:00
const DRUPAL_MINIMUM_SUPPORTED_PHP = \Drupal :: MINIMUM_SUPPORTED_PHP ;
2019-03-29 07:19:57 +00:00
Issue #2670966 by xjm, Crell, claudiu.cristea, alexpott, timmillwood, rakesh.gectcr, catch, dawehner, David_Rothstein, hchonov, martin107, tstoeckler, andypost, cilefen, RobLoach, Fabianx, salvis, hussainweb, JeroenT, larowlan, pfrenssen, daffie, webchick, wturrell: Warn users of old PHP versions
2017-12-03 05:03:36 +00:00
/**
* Minimum recommended version of PHP .
*
* Sites installing Drupal on PHP versions lower than this will see a warning
* message , but Drupal can still be installed . Used for ( e . g . ) PHP versions
* that have reached their EOL or will in the near future .
2018-02-01 11:37:06 +00:00
*
Issue #2908079 by jungle, voleger, mpdonadio, zahord, andypost, RoSk0, Mile23, claudiu.cristea, alexpott, xjm, Krzysztof Domański, naveenvalecha, piggito, Suresh Prabhu Parkala, daffie, dawehner, gumanist: Move some of the bootstrap.inc PHP-related constants to \Drupal and deprecate the old versions
2020-06-21 18:55:29 +00:00
* @ deprecated in drupal : 9.1 . 0 and is removed from drupal : 10.0 . 0. Use
* \Drupal :: RECOMMENDED_PHP instead .
*
* @ see https :// www . drupal . org / node / 2909361
Issue #2670966 by xjm, Crell, claudiu.cristea, alexpott, timmillwood, rakesh.gectcr, catch, dawehner, David_Rothstein, hchonov, martin107, tstoeckler, andypost, cilefen, RobLoach, Fabianx, salvis, hussainweb, JeroenT, larowlan, pfrenssen, daffie, webchick, wturrell: Warn users of old PHP versions
2017-12-03 05:03:36 +00:00
*/
Issue #2908079 by jungle, voleger, mpdonadio, zahord, andypost, RoSk0, Mile23, claudiu.cristea, alexpott, xjm, Krzysztof Domański, naveenvalecha, piggito, Suresh Prabhu Parkala, daffie, dawehner, gumanist: Move some of the bootstrap.inc PHP-related constants to \Drupal and deprecate the old versions
2020-06-21 18:55:29 +00:00
const DRUPAL_RECOMMENDED_PHP = \Drupal :: RECOMMENDED_PHP ;
Issue #2670966 by xjm, Crell, claudiu.cristea, alexpott, timmillwood, rakesh.gectcr, catch, dawehner, David_Rothstein, hchonov, martin107, tstoeckler, andypost, cilefen, RobLoach, Fabianx, salvis, hussainweb, JeroenT, larowlan, pfrenssen, daffie, webchick, wturrell: Warn users of old PHP versions
2017-12-03 05:03:36 +00:00
2009-10-30 22:33:35 +00:00
/**
* Minimum recommended value of PHP memory_limit .
2014-07-22 09:24:02 +00:00
*
2015-05-14 10:52:50 +00:00
* 64 M was chosen as a minimum requirement in order to allow for additional
* contributed modules to be installed prior to hitting the limit . However ,
* 40 M is the target for the Standard installation profile .
2018-02-01 11:37:06 +00:00
*
Issue #2908079 by jungle, voleger, mpdonadio, zahord, andypost, RoSk0, Mile23, claudiu.cristea, alexpott, xjm, Krzysztof Domański, naveenvalecha, piggito, Suresh Prabhu Parkala, daffie, dawehner, gumanist: Move some of the bootstrap.inc PHP-related constants to \Drupal and deprecate the old versions
2020-06-21 18:55:29 +00:00
* @ deprecated in drupal : 9.1 . 0 and is removed from drupal : 10.0 . 0. Use
* \Drupal :: MINIMUM_PHP_MEMORY_LIMIT instead .
*
* @ see https :// www . drupal . org / node / 2909361
2009-10-30 22:33:35 +00:00
*/
Issue #2908079 by jungle, voleger, mpdonadio, zahord, andypost, RoSk0, Mile23, claudiu.cristea, alexpott, xjm, Krzysztof Domański, naveenvalecha, piggito, Suresh Prabhu Parkala, daffie, dawehner, gumanist: Move some of the bootstrap.inc PHP-related constants to \Drupal and deprecate the old versions
2020-06-21 18:55:29 +00:00
const DRUPAL_MINIMUM_PHP_MEMORY_LIMIT = \Drupal :: MINIMUM_PHP_MEMORY_LIMIT ;
2009-10-30 22:33:35 +00:00
2012-09-07 04:31:33 +00:00
/**
* Error reporting level : display no errors .
*/
const ERROR_REPORTING_HIDE = 'hide' ;
/**
* Error reporting level : display errors and warnings .
*/
const ERROR_REPORTING_DISPLAY_SOME = 'some' ;
/**
* Error reporting level : display all messages .
*/
const ERROR_REPORTING_DISPLAY_ALL = 'all' ;
/**
* Error reporting level : display all messages , plus backtrace information .
*/
const ERROR_REPORTING_DISPLAY_VERBOSE = 'verbose' ;
2013-06-19 09:14:55 +00:00
/**
* The maximum number of characters in a module or theme name .
*/
const DRUPAL_EXTENSION_NAME_MAX_LENGTH = 50 ;
2008-09-17 07:11:59 +00:00
/**
2011-11-23 01:12:55 +00:00
* Time of the current request in seconds elapsed since the Unix Epoch .
2011-07-05 13:37:34 +00:00
*
2011-11-23 01:12:55 +00:00
* This differs from $_SERVER [ 'REQUEST_TIME' ], which is stored as a float
* since PHP 5.4 . 0. Float timestamps confuse most PHP functions
* ( including date_create ()) .
*
* @ see http :// php . net / manual / reserved . variables . server . php
* @ see http :// php . net / manual / function . time . php
2016-10-13 09:42:53 +00:00
*
2020-02-13 11:26:53 +00:00
* @ deprecated in drupal : 8.3 . 0 and is removed from drupal : 10.0 . 0.
2016-10-13 09:42:53 +00:00
* Use \Drupal :: time () -> getRequestTime ();
2017-05-08 10:41:45 +00:00
*
* @ see https :// www . drupal . org / node / 2785211
2008-09-17 07:11:59 +00:00
*/
2011-07-05 13:37:34 +00:00
define ( 'REQUEST_TIME' , ( int ) $_SERVER [ 'REQUEST_TIME' ]);
2008-09-17 07:11:59 +00:00
2013-03-17 06:36:36 +00:00
/**
* Defines the root directory of the Drupal installation .
*
* This strips two levels of directories off the current directory .
*/
2020-04-23 16:15:14 +00:00
define ( 'DRUPAL_ROOT' , dirname ( __DIR__ , 2 ));
2013-03-17 06:36:36 +00:00
2021-05-17 12:01:46 +00:00
/**
* Declare class aliases that will be added by the autoloader .
*/
// @todo https://www.drupal.org/project/drupal/issues/3197482 Remove this class
// alias once Drupal is running Symfony 5.3 or higher.
class_alias ( 'Drupal\Core\Http\KernelEvent' , 'Symfony\Component\HttpKernel\Event\KernelEvent' , TRUE );
2021-08-03 15:51:34 +00:00
/**
* Set up the Symfony Request factory for forward compatibility with Symfony 5.
*
* @ todo Remove this when Symfony 4 is no longer supported .
*/
Request :: setFactory (
function ( $query , $request , $attributes , $cookies , $files , $server , $content ) {
$request = new Request ( $query , $request , $attributes , $cookies , $files , $server , $content );
foreach ([ 'request' , 'query' , 'cookies' ] as $bag ) {
if ( ! ( $bag instanceof SymfonyInputBag )) {
$request -> $bag = new InputBag ( $request -> $bag -> all ());
}
}
return $request ;
}
);
2004-11-25 06:14:59 +00:00
/**
2011-12-05 12:52:27 +00:00
* Returns and optionally sets the filename for a system resource .
*
* The filename , whether provided , cached , or retrieved from the database , is
* only returned if the file exists .
2004-11-25 06:14:59 +00:00
*
2006-11-24 10:16:50 +00:00
* This function plays a key role in allowing Drupal ' s resources ( modules
* and themes ) to be located in different places depending on a site ' s
2013-07-17 14:37:04 +00:00
* configuration . For example , a module 'foo' may legally be located
2006-11-24 10:16:50 +00:00
* in any of these three places :
*
Issue #340723 by ParisLiakos, sun, Berdir, glennpratt, Cottser, swentel, alexpott, tstoeckler, Xano, tim.plunkett, BassistJimmyJam | beejeebus: Make modules and installation profiles only require .info.yml files.
2014-03-17 14:43:29 +00:00
* core / modules / foo / foo . info . yml
* modules / foo / foo . info . yml
* sites / example . com / modules / foo / foo . info . yml
2006-11-24 10:16:50 +00:00
*
* Calling drupal_get_filename ( 'module' , 'foo' ) will give you one of
* the above , depending on where the module is located .
*
2004-11-25 06:14:59 +00:00
* @ param $type
2014-04-02 07:05:28 +00:00
* The type of the item ; one of 'core' , 'profile' , 'module' , 'theme' , or
* 'theme_engine' .
2004-11-25 06:14:59 +00:00
* @ param $name
2014-04-02 07:05:28 +00:00
* The name of the item for which the filename is requested . Ignored for
* $type 'core' .
2004-11-25 06:14:59 +00:00
* @ param $filename
* The filename of the item if it is to be set explicitly rather
* than by consulting the database .
*
2018-01-22 17:09:31 +00:00
* @ return string
2013-02-11 17:35:27 +00:00
* The filename of the requested item or NULL if the item is not found .
Issue #2347783 by kim.pepper, andypost, almaudoh, gumanist, aleevas, rodrigoaguilera, Berdir, saurabh-2k17, Spokje, dhirendra.mishra, alexpott, paulocs, izus, Wim Leers, KapilV, naveenvalecha, anmolgoyal74, subson, yo30, harsha012, mrinalini9, daffie, voleger, dww, fietserwin, tim.plunkett, joachim, larowlan: Deprecate drupal_get_path() and drupal_get_filename() and replace with ExtensionList::getPath() and ExtensionList::getPathname()
2021-07-15 10:20:33 +00:00
*
* @ deprecated in drupal : 9.3 . 0 and is removed from drupal : 10.0 . 0. Use
* \Drupal\Core\Extension\ExtensionPathResolver :: getPathname () instead .
*
* @ see https :// www . drupal . org / node / 2940438
2004-11-25 06:14:59 +00:00
*/
2006-11-24 10:16:50 +00:00
function drupal_get_filename ( $type , $name , $filename = NULL ) {
Issue #2347783 by kim.pepper, andypost, almaudoh, gumanist, aleevas, rodrigoaguilera, Berdir, saurabh-2k17, Spokje, dhirendra.mishra, alexpott, paulocs, izus, Wim Leers, KapilV, naveenvalecha, anmolgoyal74, subson, yo30, harsha012, mrinalini9, daffie, voleger, dww, fietserwin, tim.plunkett, joachim, larowlan: Deprecate drupal_get_path() and drupal_get_filename() and replace with ExtensionList::getPath() and ExtensionList::getPathname()
2021-07-15 10:20:33 +00:00
@ trigger_error ( 'drupal_get_filename() is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Drupal\Core\Extension\ExtensionPathResolver::getPathname() instead. See https://www.drupal.org/node/2940438' , E_USER_DEPRECATED );
2014-04-02 07:05:28 +00:00
// Type 'core' only exists to simplify application-level logic; it always maps
// to the /core directory, whereas $name is ignored. It is only requested via
Issue #2347783 by kim.pepper, andypost, almaudoh, gumanist, aleevas, rodrigoaguilera, Berdir, saurabh-2k17, Spokje, dhirendra.mishra, alexpott, paulocs, izus, Wim Leers, KapilV, naveenvalecha, anmolgoyal74, subson, yo30, harsha012, mrinalini9, daffie, voleger, dww, fietserwin, tim.plunkett, joachim, larowlan: Deprecate drupal_get_path() and drupal_get_filename() and replace with ExtensionList::getPath() and ExtensionList::getPathname()
2021-07-15 10:20:33 +00:00
// \Drupal\Core\Extension\ExtensionList::getPath(). The file
// /core/core.info.yml does not exist, but is required since
// ExtensionList::getPath() returns the dirname() of the returned pathname.
2014-04-02 07:05:28 +00:00
if ( $type === 'core' ) {
return 'core/core.info.yml' ;
}
Issue #2659940 by almaudoh, alexpott, phenaproxima, Jo Fitzgerald, markcarver, oriol_e9g, dawehner, dsnopek, jibran, larowlan: Extension System, Part III: ThemeExtensionList and ThemeEngineExtensionList
2018-11-29 12:15:17 +00:00
try {
Issue #2208429 by dawehner, almaudoh, alexpott, jibran, Xano, donquixote, amitgoyal, bircher, stefan.r, Mile23, alvar0hurtad0, Berdir, andypost, larowlan: Extension System, Part III: ExtensionList, ModuleExtensionList and ProfileExtensionList
2018-01-24 15:21:31 +00:00
/** @var \Drupal\Core\Extension\ExtensionList $extension_list */
Issue #2659940 by almaudoh, alexpott, phenaproxima, Jo Fitzgerald, markcarver, oriol_e9g, dawehner, dsnopek, jibran, larowlan: Extension System, Part III: ThemeExtensionList and ThemeEngineExtensionList
2018-11-29 12:15:17 +00:00
$extension_list = \Drupal :: service ( " extension.list. $type " );
Issue #2208429 by dawehner, almaudoh, alexpott, jibran, Xano, donquixote, amitgoyal, bircher, stefan.r, Mile23, alvar0hurtad0, Berdir, andypost, larowlan: Extension System, Part III: ExtensionList, ModuleExtensionList and ProfileExtensionList
2018-01-24 15:21:31 +00:00
if ( isset ( $filename )) {
// Manually add the info file path of an extension.
$extension_list -> setPathname ( $name , $filename );
}
Issue #2659940 by almaudoh, alexpott, phenaproxima, Jo Fitzgerald, markcarver, oriol_e9g, dawehner, dsnopek, jibran, larowlan: Extension System, Part III: ThemeExtensionList and ThemeEngineExtensionList
2018-11-29 12:15:17 +00:00
return $extension_list -> getPathname ( $name );
2004-11-25 06:14:59 +00:00
}
Issue #2659940 by almaudoh, alexpott, phenaproxima, Jo Fitzgerald, markcarver, oriol_e9g, dawehner, dsnopek, jibran, larowlan: Extension System, Part III: ThemeExtensionList and ThemeEngineExtensionList
2018-11-29 12:15:17 +00:00
catch ( ServiceNotFoundException $e ) {
// Catch the exception. This will result in triggering an error.
// If the service is unknown, create a user-level error message.
trigger_error (
sprintf ( 'Unknown type specified: "%s". Must be one of: "core", "profile", "module", "theme", or "theme_engine".' , $type ),
E_USER_WARNING
);
}
catch ( \InvalidArgumentException $e ) {
// Catch the exception. This will result in triggering an error.
// If the filename is still unknown, create a user-level error message.
trigger_error (
sprintf ( 'The following %s is missing from the file system: %s' , $type , $name ),
E_USER_WARNING
);
2007-03-27 05:13:55 +00:00
}
2004-11-25 06:14:59 +00:00
}
2015-01-12 11:37:32 +00:00
/**
* Returns the path to a system item ( module , theme , etc . ) .
*
* @ param $type
* The type of the item ; one of 'core' , 'profile' , 'module' , 'theme' , or
* 'theme_engine' .
* @ param $name
* The name of the item for which the path is requested . Ignored for
* $type 'core' .
*
2018-01-22 17:09:31 +00:00
* @ return string
2015-01-12 11:37:32 +00:00
* The path to the requested item or an empty string if the item is not found .
Issue #2347783 by kim.pepper, andypost, almaudoh, gumanist, aleevas, rodrigoaguilera, Berdir, saurabh-2k17, Spokje, dhirendra.mishra, alexpott, paulocs, izus, Wim Leers, KapilV, naveenvalecha, anmolgoyal74, subson, yo30, harsha012, mrinalini9, daffie, voleger, dww, fietserwin, tim.plunkett, joachim, larowlan: Deprecate drupal_get_path() and drupal_get_filename() and replace with ExtensionList::getPath() and ExtensionList::getPathname()
2021-07-15 10:20:33 +00:00
*
* @ deprecated in drupal : 9.3 . 0 and is removed from drupal : 10.0 . 0. Use
* \Drupal\Core\Extension\ExtensionPathResolver :: getPath () instead .
*
* @ see https :// www . drupal . org / node / 2940438
* @ see \Drupal\Core\Extension\ExtensionList :: getPath ()
2015-01-12 11:37:32 +00:00
*/
function drupal_get_path ( $type , $name ) {
Issue #2347783 by kim.pepper, andypost, almaudoh, gumanist, aleevas, rodrigoaguilera, Berdir, saurabh-2k17, Spokje, dhirendra.mishra, alexpott, paulocs, izus, Wim Leers, KapilV, naveenvalecha, anmolgoyal74, subson, yo30, harsha012, mrinalini9, daffie, voleger, dww, fietserwin, tim.plunkett, joachim, larowlan: Deprecate drupal_get_path() and drupal_get_filename() and replace with ExtensionList::getPath() and ExtensionList::getPathname()
2021-07-15 10:20:33 +00:00
@ trigger_error ( 'drupal_get_path() is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Drupal\Core\Extension\ExtensionPathResolver::getPath() instead. See https://www.drupal.org/node/2940438' , E_USER_DEPRECATED );
2015-01-12 11:37:32 +00:00
return dirname ( drupal_get_filename ( $type , $name ));
}
2010-02-17 02:52:15 +00:00
/**
2010-04-29 05:03:28 +00:00
* Translates a string to the current language or to a given language .
2010-02-17 02:52:15 +00:00
*
2015-10-27 12:46:40 +00:00
* In order for strings to be localized , make them available in one of the ways
2016-02-04 12:19:52 +00:00
* supported by the @ link i18n Localization API . @ endlink When possible , use
* the \Drupal\Core\StringTranslation\StringTranslationTrait $this -> t () .
* Otherwise create a new \Drupal\Core\StringTranslation\TranslatableMarkup
* object directly .
2015-10-27 12:46:40 +00:00
*
* See \Drupal\Core\StringTranslation\TranslatableMarkup :: __construct () for
* important security information and usage guidelines .
*
* @ param string $string
* A string containing the English text to translate .
* @ param array $args
* ( optional ) An associative array of replacements to make after translation .
* Based on the first character of the key , the value is escaped and / or
* themed . See
* \Drupal\Component\Render\FormattableMarkup :: placeholderFormat () for
* details .
* @ param array $options
* ( optional ) An associative array of additional options , with the following
* elements :
* - 'langcode' ( defaults to the current language ) : A language code , to
2011-01-13 01:04:13 +00:00
* translate to a language other than what is used to display the page .
* - 'context' ( defaults to the empty context ) : The context the source string
2016-03-08 23:29:53 +00:00
* belongs to . See the @ link i18n Internationalization topic @ endlink for
* more information about string contexts .
2010-04-29 05:03:28 +00:00
*
2015-10-22 23:24:23 +00:00
* @ return \Drupal\Core\StringTranslation\TranslatableMarkup
2015-10-27 12:46:40 +00:00
* An object that , when cast to a string , returns the translated string .
*
* @ see \Drupal\Component\Render\FormattableMarkup :: placeholderFormat ()
* @ see \Drupal\Core\StringTranslation\StringTranslationTrait :: t ()
* @ see \Drupal\Core\StringTranslation\TranslatableMarkup :: __construct ()
2010-04-24 14:53:59 +00:00
*
* @ ingroup sanitization
2010-02-17 02:52:15 +00:00
*/
2017-03-04 01:20:24 +00:00
function t ( $string , array $args = [], array $options = []) {
2016-02-23 07:03:02 +00:00
return new TranslatableMarkup ( $string , $args , $options );
2011-08-07 15:01:39 +00:00
}
2010-05-26 07:52:13 +00:00
/**
2011-12-05 12:52:27 +00:00
* Logs an exception .
2010-05-26 07:52:13 +00:00
*
2014-10-05 12:00:50 +00:00
* This is a wrapper logging function which automatically decodes an exception .
2010-05-26 07:52:13 +00:00
*
* @ param $type
* The category to which this message belongs .
* @ param $exception
* The exception that is going to be logged .
* @ param $message
* The message to store in the log . If empty , a text that contains all useful
2011-04-12 20:54:16 +00:00
* information about the passed - in exception is used .
2010-05-26 07:52:13 +00:00
* @ param $variables
2012-12-03 13:08:48 +00:00
* Array of variables to replace in the message on display or
* NULL if message is already translated or not possible to
* translate .
2010-05-26 07:52:13 +00:00
* @ param $severity
* The severity of the message , as per RFC 3164.
* @ param $link
* A link to associate with the message .
*
2014-01-09 11:50:54 +00:00
* @ see \Drupal\Core\Utility\Error :: decodeException ()
2010-05-26 07:52:13 +00:00
*/
2017-03-04 01:20:24 +00:00
function watchdog_exception ( $type , Exception $exception , $message = NULL , $variables = [], $severity = RfcLogLevel :: ERROR , $link = NULL ) {
2010-05-26 07:52:13 +00:00
2014-06-26 18:55:12 +00:00
// Use a default value if $message is not set.
if ( empty ( $message )) {
2022-02-20 09:43:10 +00:00
$message = Error :: DEFAULT_ERROR_MESSAGE ;
2014-06-26 18:55:12 +00:00
}
if ( $link ) {
$variables [ 'link' ] = $link ;
}
$variables += Error :: decodeException ( $exception );
\Drupal :: logger ( $type ) -> log ( $severity , $message , $variables );
2010-05-26 07:52:13 +00:00
}
2010-02-15 15:52:27 +00:00
/**
2011-12-05 12:52:27 +00:00
* Provides custom PHP error handling .
2010-02-15 15:52:27 +00:00
*
* @ param $error_level
* The level of the error raised .
* @ param $message
* The error message .
* @ param $filename
2018-10-26 11:57:37 +00:00
* ( optional ) The filename that the error was raised in .
2010-02-15 15:52:27 +00:00
* @ param $line
2018-10-26 11:57:37 +00:00
* ( optional ) The line number the error was raised at .
2010-02-15 15:52:27 +00:00
*/
2020-09-30 08:45:46 +00:00
function _drupal_error_handler ( $error_level , $message , $filename = NULL , $line = NULL ) {
2013-05-09 09:25:10 +00:00
require_once __DIR__ . '/errors.inc' ;
2020-09-30 08:45:46 +00:00
_drupal_error_handler_real ( $error_level , $message , $filename , $line );
2010-02-15 15:52:27 +00:00
}
/**
2011-12-05 12:52:27 +00:00
* Provides custom PHP exception handling .
2010-02-15 15:52:27 +00:00
*
* Uncaught exceptions are those not enclosed in a try / catch block . They are
* always fatal : the execution of the script will stop as soon as the exception
* handler exits .
*
2015-07-22 15:46:53 +00:00
* @ param \Exception | \Throwable $exception
2010-02-15 15:52:27 +00:00
* The exception object that was thrown .
*/
function _drupal_exception_handler ( $exception ) {
2013-05-09 09:25:10 +00:00
require_once __DIR__ . '/errors.inc' ;
2010-04-03 03:36:11 +00:00
try {
// Log the message to the watchdog and return an error page to the user.
2014-01-09 11:50:54 +00:00
_drupal_log_error ( Error :: decodeException ( $exception ), TRUE );
2010-04-03 03:36:11 +00:00
}
2019-05-24 10:36:30 +00:00
// Catch \Throwable, which covers both Error and Exception throwables.
2015-07-22 15:46:53 +00:00
catch ( \Throwable $error ) {
_drupal_exception_handler_additional ( $exception , $error );
2015-04-13 11:11:11 +00:00
}
}
/**
* Displays any additional errors caught while handling an exception .
*
2015-07-22 15:46:53 +00:00
* @ param \Exception | \Throwable $exception
2015-04-13 11:11:11 +00:00
* The first exception object that was thrown .
2015-07-22 15:46:53 +00:00
* @ param \Exception | \Throwable $exception2
2015-04-13 11:11:11 +00:00
* The second exception object that was thrown .
*/
function _drupal_exception_handler_additional ( $exception , $exception2 ) {
// Another uncaught exception was thrown while handling the first one.
// If we are displaying errors, then do so with no possibility of a further
// uncaught exception being thrown.
if ( error_displayable ()) {
print '<h1>Additional uncaught exception thrown while handling exception.</h1>' ;
print '<h2>Original</h2><p>' . Error :: renderExceptionSafe ( $exception ) . '</p>' ;
print '<h2>Additional</h2><p>' . Error :: renderExceptionSafe ( $exception2 ) . '</p><hr />' ;
2010-04-03 03:36:11 +00:00
}
2010-02-15 15:52:27 +00:00
}
2009-07-22 04:45:35 +00:00
/**
2011-12-05 12:52:27 +00:00
* Returns the test prefix if this is an internal request from SimpleTest .
2010-11-05 19:05:02 +00:00
*
2012-10-09 20:32:40 +00:00
* @ param string $new_prefix
2014-02-10 17:31:31 +00:00
* Internal use only . A new prefix to be stored .
2012-10-09 20:32:40 +00:00
*
2016-08-28 11:25:45 +00:00
* @ return string | false
2010-11-05 19:05:02 +00:00
* Either the simpletest prefix ( the string " simpletest " followed by any
* number of digits ) or FALSE if the user agent does not contain a valid
* HMAC and timestamp .
2009-07-22 04:45:35 +00:00
*/
2012-10-09 20:32:40 +00:00
function drupal_valid_test_ua ( $new_prefix = NULL ) {
2010-11-05 19:05:02 +00:00
static $test_prefix ;
2012-10-09 20:32:40 +00:00
if ( isset ( $new_prefix )) {
$test_prefix = $new_prefix ;
}
2010-11-05 19:05:02 +00:00
if ( isset ( $test_prefix )) {
return $test_prefix ;
}
2014-02-10 17:31:31 +00:00
// Unless the below User-Agent and HMAC validation succeeds, we are not in
// a test environment.
$test_prefix = FALSE ;
2009-07-22 04:45:35 +00:00
Issue #2232861 by grom358, daffie, alexpott, larowlan, pfrenssen, hussainweb, pcambra, jibran, phenaproxima, moshe weitzman, nick_schuch: Create BrowserTestBase for web-testing on top of Mink
2015-04-12 11:08:53 +00:00
// A valid Simpletest request will contain a hashed and salted authentication
// code. Check if this code is present in a cookie or custom user agent
// string.
2021-11-15 02:19:43 +00:00
$http_user_agent = $_SERVER [ 'HTTP_USER_AGENT' ] ? ? NULL ;
$user_agent = $_COOKIE [ 'SIMPLETEST_USER_AGENT' ] ? ? $http_user_agent ;
2016-09-16 10:35:51 +00:00
if ( isset ( $user_agent ) && preg_match ( " /^simple( \ w+ \ d+):(.+):(.+):(.+) $ / " , $user_agent , $matches )) {
2021-11-15 02:35:55 +00:00
[, $prefix , $time , $salt , $hmac ] = $matches ;
2016-04-29 11:02:20 +00:00
$check_string = $prefix . ':' . $time . ':' . $salt ;
2014-02-10 17:31:31 +00:00
// Read the hash salt prepared by drupal_generate_test_ua().
// This function is called before settings.php is read and Drupal's error
// handlers are set up. While Drupal's error handling may be properly
// configured on production sites, the server's PHP error_reporting may not.
// Ensure that no information leaks on production sites.
2016-09-16 10:35:51 +00:00
$test_db = new TestDatabase ( $prefix );
$key_file = DRUPAL_ROOT . '/' . $test_db -> getTestSitePath () . '/.htkey' ;
SA-CORE-2020-005 by lorenzo_gre, jazzy2fives, xjm, samuel.mortenson, pwolanin, larowlan, greggles, cashwilliams, Heine, mcdruid, alexpott, Gábor Hojtsy
(cherry picked from commit b34dc3f7bcbf4d890a0f746a1e88e4d8edf7947a)
2020-06-17 17:56:11 +00:00
if ( ! is_readable ( $key_file ) || is_dir ( $key_file )) {
2014-02-10 17:31:31 +00:00
header ( $_SERVER [ 'SERVER_PROTOCOL' ] . ' 403 Forbidden' );
exit ;
}
$private_key = file_get_contents ( $key_file );
SA-CORE-2020-005 by lorenzo_gre, jazzy2fives, xjm, samuel.mortenson, pwolanin, larowlan, greggles, cashwilliams, Heine, mcdruid, alexpott, Gábor Hojtsy
(cherry picked from commit b34dc3f7bcbf4d890a0f746a1e88e4d8edf7947a)
2020-06-17 17:56:11 +00:00
// The string from drupal_generate_test_ua() is 74 bytes long. If we don't
// have it, tests cannot be allowed.
if ( empty ( $private_key ) || strlen ( $private_key ) < 74 ) {
header ( $_SERVER [ 'SERVER_PROTOCOL' ] . ' 403 Forbidden' );
exit ;
}
2014-02-10 17:31:31 +00:00
// The file properties add more entropy not easily accessible to others.
$key = $private_key . filectime ( __FILE__ ) . fileinode ( __FILE__ );
Issue #3112283 by ravi.shankar, mpdonadio, andregp, daffie, jhedstrom, alexpott, andypost, pifagor, vladbo, JeroenT, voleger, cliddell: Replace REQUEST_TIME in non-OO and non-module code
2022-05-16 16:32:49 +00:00
$time_diff = time () - $time ;
2014-02-10 17:31:31 +00:00
$test_hmac = Crypt :: hmacBase64 ( $check_string , $key );
2016-08-26 17:37:15 +00:00
// Since we are making a local request a 600 second time window is allowed,
2010-11-05 19:05:02 +00:00
// and the HMAC must match.
2019-06-10 13:28:03 +00:00
if ( $time_diff >= 0 && $time_diff <= 600 && hash_equals ( $test_hmac , $hmac )) {
2010-11-05 19:05:02 +00:00
$test_prefix = $prefix ;
}
2016-08-26 17:37:15 +00:00
else {
header ( $_SERVER [ 'SERVER_PROTOCOL' ] . ' 403 Forbidden (SIMPLETEST_USER_AGENT invalid)' );
exit ;
}
2010-11-05 19:05:02 +00:00
}
2012-02-11 05:24:47 +00:00
return $test_prefix ;
2009-07-22 04:45:35 +00:00
}
/**
2011-12-05 12:52:27 +00:00
* Generates a user agent string with a HMAC and timestamp for simpletest .
2009-07-22 04:45:35 +00:00
*/
function drupal_generate_test_ua ( $prefix ) {
2014-02-10 17:31:31 +00:00
static $key , $last_prefix ;
if ( ! isset ( $key ) || $last_prefix != $prefix ) {
$last_prefix = $prefix ;
2016-09-16 10:35:51 +00:00
$test_db = new TestDatabase ( $prefix );
$key_file = DRUPAL_ROOT . '/' . $test_db -> getTestSitePath () . '/.htkey' ;
2014-02-10 17:31:31 +00:00
// When issuing an outbound HTTP client request from within an inbound test
// request, then the outbound request has to use the same User-Agent header
// as the inbound request. A newly generated private key for the same test
// prefix would invalidate all subsequent inbound requests.
2019-07-30 21:35:12 +00:00
// @see \Drupal\Core\Test\HttpClientMiddleware\TestHttpClientMiddleware
2014-02-10 17:31:31 +00:00
if ( DRUPAL_TEST_IN_CHILD_SITE && $parent_prefix = drupal_valid_test_ua ()) {
if ( $parent_prefix != $prefix ) {
throw new \RuntimeException ( " Malformed User-Agent: Expected ' $parent_prefix ' but got ' $prefix '. " );
}
// If the file is not readable, a PHP warning is expected in this case.
$private_key = file_get_contents ( $key_file );
}
else {
// Generate and save a new hash salt for a test run.
// Consumed by drupal_valid_test_ua() before settings.php is loaded.
2014-02-27 04:48:12 +00:00
$private_key = Crypt :: randomBytesBase64 ( 55 );
2014-02-10 17:31:31 +00:00
file_put_contents ( $key_file , $private_key );
}
// The file properties add more entropy not easily accessible to others.
$key = $private_key . filectime ( __FILE__ ) . fileinode ( __FILE__ );
2009-07-22 04:45:35 +00:00
}
2010-11-05 19:05:02 +00:00
// Generate a moderately secure HMAC based on the database credentials.
$salt = uniqid ( '' , TRUE );
Issue #2469713 by dawehner, pfrenssen, alexpott, elachlan, Mixologic, larowlan, hussainweb, benjy, jibran, Wim Leers, isntall: Step 2: Create a JavaScriptTestBase using PhantomJs Driver/Binary
2016-04-07 11:25:35 +00:00
$check_string = $prefix . ':' . time () . ':' . $salt ;
2016-09-16 10:35:51 +00:00
return 'simple' . $check_string . ':' . Crypt :: hmacBase64 ( $check_string , $key );
2009-07-22 04:45:35 +00:00
}
2005-07-27 01:58:43 +00:00
/**
2007-11-30 12:19:10 +00:00
* Enables use of the theme system without requiring database access .
*
* Loads and initializes the theme system for site installs , updates and when
2009-04-19 19:10:08 +00:00
* the site is in maintenance mode . This also applies when the database fails .
2007-11-30 12:19:10 +00:00
*
* @ see _drupal_maintenance_theme ()
2005-07-27 01:58:43 +00:00
*/
function drupal_maintenance_theme () {
2013-05-09 09:25:10 +00:00
require_once __DIR__ . '/theme.maintenance.inc' ;
2007-11-30 12:19:10 +00:00
_drupal_maintenance_theme ();
2005-07-27 01:58:43 +00:00
}
2006-09-01 08:44:53 +00:00
2009-04-02 20:39:45 +00:00
/**
2011-12-05 12:52:27 +00:00
* Provides central static variable storage .
2009-04-02 20:39:45 +00:00
*
2009-11-20 06:12:45 +00:00
* All functions requiring a static variable to persist or cache data within
* a single page request are encouraged to use this function unless it is
* absolutely certain that the static variable will not need to be reset during
* the page request . By centralizing static variable storage through this
* function , other functions can rely on a consistent API for resetting any
* other function ' s static variables .
*
* Example :
* @ code
2012-01-23 15:46:29 +00:00
* function example_list ( $field = 'default' ) {
* $examples = & drupal_static ( __FUNCTION__ );
* if ( ! isset ( $examples )) {
2009-11-20 06:12:45 +00:00
* // If this function is being called for the first time after a reset,
* // query the database and execute any other code needed to retrieve
2012-01-23 15:46:29 +00:00
* // information.
2009-11-20 06:12:45 +00:00
* ...
* }
2012-01-23 15:46:29 +00:00
* if ( ! isset ( $examples [ $field ])) {
2009-11-20 06:12:45 +00:00
* // If this function is being called for the first time for a particular
* // index field, then execute code needed to index the information already
2012-01-23 15:46:29 +00:00
* // available in $examples by the desired field.
2009-11-20 06:12:45 +00:00
* ...
* }
* // Subsequent invocations of this function for a particular index field
* // skip the above two code blocks and quickly return the already indexed
* // information.
2012-01-23 15:46:29 +00:00
* return $examples [ $field ];
2009-11-20 06:12:45 +00:00
* }
2012-01-23 15:46:29 +00:00
* function examples_admin_overview () {
* // When building the content for the overview page, make sure to get
* // completely fresh information.
* drupal_static_reset ( 'example_list' );
2009-11-20 06:12:45 +00:00
* ...
* }
* @ endcode
*
* In a few cases , a function can have certainty that there is no legitimate
* use - case for resetting that function ' s static variable . This is rare ,
* because when writing a function , it ' s hard to forecast all the situations in
* which it will be used . A guideline is that if a function ' s static variable
* does not depend on any information outside of the function that might change
* during a single page request , then it ' s ok to use the " static " keyword
* instead of the drupal_static () function .
*
* Example :
* @ code
2014-04-10 17:30:54 +00:00
* function mymodule_log_stream_handle ( $new_handle = NULL ) {
* static $handle ;
* if ( isset ( $new_handle )) {
* $handle = $new_handle ;
2009-11-20 06:12:45 +00:00
* }
2014-04-10 17:30:54 +00:00
* return $handle ;
2009-11-20 06:12:45 +00:00
* }
* @ endcode
*
* In a few cases , a function needs a resettable static variable , but the
* function is called many times ( 100 + ) during a single page request , so
* every microsecond of execution time that can be removed from the function
* counts . These functions can use a more cumbersome , but faster variant of
2010-01-07 04:54:18 +00:00
* calling drupal_static () . It works by storing the reference returned by
* drupal_static () in the calling function ' s own static variable , thereby
* removing the need to call drupal_static () for each iteration of the function .
* Conceptually , it replaces :
* @ code
* $foo = & drupal_static ( __FUNCTION__ );
* @ endcode
* with :
* @ code
* // Unfortunately, this does not work.
* static $foo = & drupal_static ( __FUNCTION__ );
* @ endcode
* However , the above line of code does not work , because PHP only allows static
2014-09-18 14:21:39 +00:00
* variables to be initialized by literal values , and does not allow static
2010-01-07 04:54:18 +00:00
* variables to be assigned to references .
2012-03-24 06:14:35 +00:00
* - http :// php . net / manual / language . variables . scope . php #language.variables.scope.static
* - http :// php . net / manual / language . variables . scope . php #language.variables.scope.references
2010-01-07 04:54:18 +00:00
* The example below shows the syntax needed to work around both limitations .
2015-05-24 20:08:46 +00:00
* For benchmarks and more information , see https :// www . drupal . org / node / 619666.
2009-11-20 06:12:45 +00:00
*
* Example :
* @ code
2014-07-20 10:28:21 +00:00
* function example_default_format_type () {
2009-11-20 06:12:45 +00:00
* // Use the advanced drupal_static() pattern, since this is called very often.
2010-01-07 04:54:18 +00:00
* static $drupal_static_fast ;
* if ( ! isset ( $drupal_static_fast )) {
2014-07-20 10:28:21 +00:00
* $drupal_static_fast [ 'format_type' ] = & drupal_static ( __FUNCTION__ );
2010-01-07 04:54:18 +00:00
* }
2014-07-20 10:28:21 +00:00
* $format_type = & $drupal_static_fast [ 'format_type' ];
2009-11-20 06:12:45 +00:00
* ...
* }
* @ endcode
*
2009-04-02 20:39:45 +00:00
* @ param $name
* Globally unique name for the variable . For a function with only one static ,
* variable , the function name ( e . g . via the PHP magic __FUNCTION__ constant )
2009-05-24 17:39:35 +00:00
* is recommended . For a function with multiple static variables add a
2009-04-02 20:39:45 +00:00
* distinguishing suffix to the function name for each one .
* @ param $default_value
* Optional default value .
* @ param $reset
2014-09-16 11:51:03 +00:00
* TRUE to reset one or all variables ( s ) . This parameter is only used
* internally and should not be passed in ; use drupal_static_reset () instead .
* ( This function ' s return value should not be used when TRUE is passed in . )
2009-04-02 20:39:45 +00:00
*
2019-09-11 09:38:51 +00:00
* @ return mixed
2009-11-08 20:36:12 +00:00
* Returns a variable by reference .
2009-11-20 06:12:45 +00:00
*
* @ see drupal_static_reset ()
2009-04-02 20:39:45 +00:00
*/
function & drupal_static ( $name , $default_value = NULL , $reset = FALSE ) {
2017-03-04 01:20:24 +00:00
static $data = [], $default = [];
2010-07-18 01:22:53 +00:00
// First check if dealing with a previously defined static variable.
if ( isset ( $data [ $name ]) || array_key_exists ( $name , $data )) {
// Non-NULL $name and both $data[$name] and $default[$name] statics exist.
if ( $reset ) {
// Reset pre-existing static variable to its default value.
2009-11-08 20:36:12 +00:00
$data [ $name ] = $default [ $name ];
2009-04-02 20:39:45 +00:00
}
2010-07-18 01:22:53 +00:00
return $data [ $name ];
}
// Neither $data[$name] nor $default[$name] static variables exist.
if ( isset ( $name )) {
if ( $reset ) {
2009-11-08 20:36:12 +00:00
// Reset was called before a default is set and yet a variable must be
// returned.
return $data ;
2009-04-02 20:39:45 +00:00
}
2010-07-18 01:22:53 +00:00
// First call with new non-NULL $name. Initialize a new static variable.
2009-11-08 20:36:12 +00:00
$default [ $name ] = $data [ $name ] = $default_value ;
2010-07-18 01:22:53 +00:00
return $data [ $name ];
}
// Reset all: ($name == NULL). This needs to be done one at a time so that
// references returned by earlier invocations of drupal_static() also get
// reset.
foreach ( $default as $name => $value ) {
$data [ $name ] = $value ;
2009-04-02 20:39:45 +00:00
}
2010-07-18 01:22:53 +00:00
// As the function returns a reference, the return should always be a
// variable.
return $data ;
2009-04-02 20:39:45 +00:00
}
/**
2011-12-05 12:52:27 +00:00
* Resets one or all centrally stored static variable ( s ) .
2009-04-02 20:39:45 +00:00
*
* @ param $name
* Name of the static variable to reset . Omit to reset all variables .
2014-09-16 11:51:03 +00:00
* Resetting all variables should only be used , for example , for running
* unit tests with a clean environment .
2009-04-02 20:39:45 +00:00
*/
function drupal_static_reset ( $name = NULL ) {
2021-07-02 16:42:38 +00:00
switch ( $name ) {
case 'taxonomy_vocabulary_get_names' :
Issue #2412669 by claudiu.cristea, Julfabre, sidharrell, catch, daffie, Berdir, andypost, tedbow, kim.pepper, ParisLiakos, Mile23: Remove drupal_static from BookManager
2021-07-14 09:28:37 +00:00
@ trigger_error ( " Calling drupal_static_reset() with 'taxonomy_vocabulary_get_names' as argument is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. There is no replacement for this usage. See https://www.drupal.org/node/3039041 " , E_USER_DEPRECATED );
2021-07-02 16:42:38 +00:00
break ;
2021-07-12 08:00:22 +00:00
case 'node_mark' :
@ trigger_error ( " Calling drupal_static_reset() with 'node_mark' as argument is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. There is no replacement for this usage. See https://www.drupal.org/node/3037203 " , E_USER_DEPRECATED );
break ;
Issue #2412669 by claudiu.cristea, Julfabre, sidharrell, catch, daffie, Berdir, andypost, tedbow, kim.pepper, ParisLiakos, Mile23: Remove drupal_static from BookManager
2021-07-14 09:28:37 +00:00
case 'Drupal\book\BookManager::bookSubtreeData' :
case 'Drupal\book\BookManager::bookTreeAllData' :
case 'Drupal\book\BookManager::doBookTreeBuild' :
@ trigger_error ( " Calling drupal_static_reset() with ' { $name } ' as argument is deprecated in drupal:9.3.0 and is removed in drupal:10.0.0. Use \ Drupal::service('book.memory_cache')->deleteAll() instead. See https://www.drupal.org/node/3039439 " , E_USER_DEPRECATED );
\Drupal :: service ( 'book.memory_cache' ) -> deleteAll ();
break ;
2021-07-02 16:42:38 +00:00
}
2009-04-02 20:39:45 +00:00
drupal_static ( $name , NULL , TRUE );
}
2009-09-19 10:38:47 +00:00
2010-02-17 22:44:52 +00:00
/**
2011-12-05 12:52:27 +00:00
* Registers a function for execution on shutdown .
2010-02-17 22:44:52 +00:00
*
2010-08-22 14:11:47 +00:00
* Wrapper for register_shutdown_function () that catches thrown exceptions to
* avoid " Exception thrown without a stack frame in Unknown " .
2010-02-17 22:44:52 +00:00
*
2018-01-23 12:14:26 +00:00
* @ param callable $callback
2010-02-17 22:44:52 +00:00
* The shutdown function to register .
2010-08-22 14:11:47 +00:00
* @ param ...
* Additional arguments to pass to the shutdown function .
*
2018-01-22 17:09:31 +00:00
* @ return array
2010-02-17 22:44:52 +00:00
* Array of shutdown functions to be executed .
*
* @ see register_shutdown_function ()
2010-06-11 11:00:18 +00:00
* @ ingroup php_wrappers
2010-02-17 22:44:52 +00:00
*/
2010-08-22 14:11:47 +00:00
function & drupal_register_shutdown_function ( $callback = NULL ) {
// We cannot use drupal_static() here because the static cache is reset during
// batch processing, which breaks batch handling.
2017-03-04 01:20:24 +00:00
static $callbacks = [];
2010-02-17 22:44:52 +00:00
if ( isset ( $callback )) {
// Only register the internal shutdown function once.
if ( empty ( $callbacks )) {
register_shutdown_function ( '_drupal_shutdown_function' );
}
$args = func_get_args ();
2014-02-14 12:35:19 +00:00
// Remove $callback from the arguments.
unset ( $args [ 0 ]);
2010-02-17 22:44:52 +00:00
// Save callback and arguments
2017-03-04 01:20:24 +00:00
$callbacks [] = [ 'callback' => $callback , 'arguments' => $args ];
2010-02-17 22:44:52 +00:00
}
return $callbacks ;
}
/**
2011-12-05 12:52:27 +00:00
* Executes registered shutdown functions .
2010-02-17 22:44:52 +00:00
*/
function _drupal_shutdown_function () {
$callbacks = & drupal_register_shutdown_function ();
2011-01-01 22:46:02 +00:00
// Set the CWD to DRUPAL_ROOT as it is not guaranteed to be the same as it
// was in the normal context of execution.
chdir ( DRUPAL_ROOT );
2010-02-17 22:44:52 +00:00
try {
2018-10-20 07:14:35 +00:00
reset ( $callbacks );
// Do not use foreach() here because it is possible that the callback will
// add to the $callbacks array via drupal_register_shutdown_function().
while ( $callback = current ( $callbacks )) {
2010-02-17 22:44:52 +00:00
call_user_func_array ( $callback [ 'callback' ], $callback [ 'arguments' ]);
2018-10-20 07:14:35 +00:00
next ( $callbacks );
2010-02-17 22:44:52 +00:00
}
}
2019-05-24 10:36:30 +00:00
// Catch \Throwable, which covers both Error and Exception throwables.
2015-07-22 15:46:53 +00:00
catch ( \Throwable $error ) {
_drupal_shutdown_function_handle_exception ( $error );
2015-04-13 11:11:11 +00:00
}
}
/**
* Displays and logs any errors that may happen during shutdown .
*
2015-07-22 15:46:53 +00:00
* @ param \Exception | \Throwable $exception
2015-04-13 11:11:11 +00:00
* The exception object that was thrown .
*
* @ see _drupal_shutdown_function ()
*/
function _drupal_shutdown_function_handle_exception ( $exception ) {
// If using PHP-FPM then fastcgi_finish_request() will have been fired
// preventing further output to the browser.
if ( ! function_exists ( 'fastcgi_finish_request' )) {
// If we are displaying errors, then do so with no possibility of a
// further uncaught exception being thrown.
require_once __DIR__ . '/errors.inc' ;
if ( error_displayable ()) {
print '<h1>Uncaught exception thrown in shutdown function.</h1>' ;
print '<p>' . Error :: renderExceptionSafe ( $exception ) . '</p><hr />' ;
2010-04-03 03:36:11 +00:00
}
2010-02-17 22:44:52 +00:00
}
2015-04-13 11:11:11 +00:00
error_log ( $exception );
2010-02-17 22:44:52 +00:00
}