diff --git a/cli-script.php b/cli-script.php
index e00fe27a1..e979d96c2 100755
--- a/cli-script.php
+++ b/cli-script.php
@@ -2,7 +2,7 @@
// CLI specific bootstrapping
use SilverStripe\Control\CLIRequestBuilder;
-use SilverStripe\Core\AppKernel;
+use SilverStripe\Core\CoreKernel;
use SilverStripe\Core\HTTPApplication;
require __DIR__ . '/src/includes/autoload.php';
@@ -17,7 +17,7 @@ if (!in_array(PHP_SAPI, ["cli", "cgi", "cgi-fcgi"])) {
$request = CLIRequestBuilder::createFromEnvironment();
// Default application
-$kernel = new AppKernel(BASE_PATH);
+$kernel = new CoreKernel(BASE_PATH);
$app = new HTTPApplication($kernel);
$response = $app->handle($request);
$response->output();
diff --git a/docs/en/02_Developer_Guides/08_Performance/05_Resource_Usage.md b/docs/en/02_Developer_Guides/08_Performance/05_Resource_Usage.md
index 670f9a805..8d9a3ef8c 100644
--- a/docs/en/02_Developer_Guides/08_Performance/05_Resource_Usage.md
+++ b/docs/en/02_Developer_Guides/08_Performance/05_Resource_Usage.md
@@ -19,16 +19,11 @@ resources are required temporarily. In general, we recommend running resource in
[command line](../cli), where configuration defaults for these settings are higher or even unlimited.
-SilverStripe can request more resources through `increase_memory_limit_to()` and `increase_time_limit_to()` functions.
+SilverStripe can request more resources through `Environment::increaseMemoryLimitTo()` and
+`Environment::increaseTimeLimitTo()` functions.
:::php
- function myBigFunction() {
- increase_time_limit_to(400);
-
- // or..
-
- set_increase_time_limit_max();
-
- // ..
- }
\ No newline at end of file
+ public function myBigFunction() {
+ Environment::increaseTimeLimitTo(400);
+ }
diff --git a/main.php b/main.php
index 695e1202a..a7d076982 100644
--- a/main.php
+++ b/main.php
@@ -1,7 +1,7 @@
addMiddleware(new ErrorControlChainMiddleware($app));
$response = $app->handle($request);
diff --git a/src/Core/AppKernel.php b/src/Core/AppKernel.php
deleted file mode 100644
index ceb2dcc31..000000000
--- a/src/Core/AppKernel.php
+++ /dev/null
@@ -1,428 +0,0 @@
-basePath = $basePath;
-
- // Initialise the dependency injector as soon as possible, as it is
- // subsequently used by some of the following code
- $injectorLoader = InjectorLoader::inst();
- $injector = new Injector(array('locator' => SilverStripeServiceConfigurationLocator::class));
- $injectorLoader->pushManifest($injector);
- $this->setInjectorLoader($injectorLoader);
-
- // Manifest cache factory
- $manifestCacheFactory = $this->buildManifestCacheFactory();
-
- // Class loader
- $classLoader = ClassLoader::inst();
- $classLoader->pushManifest(new ClassManifest($basePath, $manifestCacheFactory));
- $this->setClassLoader($classLoader);
-
- // Module loader
- $moduleLoader = ModuleLoader::inst();
- $moduleManifest = new ModuleManifest($basePath, $manifestCacheFactory);
- $moduleLoader->pushManifest($moduleManifest);
- $this->setModuleLoader($moduleLoader);
-
- // Config loader
- // @todo refactor CoreConfigFactory
- $configFactory = new CoreConfigFactory($manifestCacheFactory);
- $configManifest = $configFactory->createRoot();
- $configLoader = ConfigLoader::inst();
- $configLoader->pushManifest($configManifest);
- $this->setConfigLoader($configLoader);
-
- // Load template manifest
- $themeResourceLoader = ThemeResourceLoader::inst();
- $themeResourceLoader->addSet('$default', new ThemeManifest(
- $basePath,
- project(),
- $manifestCacheFactory
- ));
- $this->setThemeResourceLoader($themeResourceLoader);
- }
-
- public function getEnvironment()
- {
- // Check set
- if ($this->enviroment) {
- return $this->enviroment;
- }
-
- // Check saved session
- $env = $this->sessionEnvironment();
- if ($env) {
- return $env;
- }
-
- // Check getenv
- if ($env = getenv('SS_ENVIRONMENT_TYPE')) {
- return $env;
- }
-
- return self::LIVE;
- }
-
- /**
- * Check or update any temporary environment specified in the session.
- *
- * @return null|string
- */
- protected function sessionEnvironment()
- {
- // Check isDev in querystring
- if (isset($_GET['isDev'])) {
- if (isset($_SESSION)) {
- unset($_SESSION['isTest']); // In case we are changing from test mode
- $_SESSION['isDev'] = $_GET['isDev'];
- }
- return self::DEV;
- }
-
- // Check isTest in querystring
- if (isset($_GET['isTest'])) {
- if (isset($_SESSION)) {
- unset($_SESSION['isDev']); // In case we are changing from dev mode
- $_SESSION['isTest'] = $_GET['isTest'];
- }
- return self::TEST;
- }
-
- // Check session
- if (!empty($_SESSION['isDev'])) {
- return self::DEV;
- }
- if (!empty($_SESSION['isTest'])) {
- return self::TEST;
- }
-
- // no session environment
- return null;
- }
-
- public function boot($flush = false)
- {
- $this->bootPHP();
- $this->bootManifests($flush);
- $this->bootErrorHandling();
- $this->bootDatabase();
- }
-
- /**
- * Configure database
- *
- * @throws HTTPResponse_Exception
- */
- protected function bootDatabase()
- {
- // Check if a DB is named
- $name = $this->getDatabaseName();
-
- // Gracefully fail if no DB is configured
- if (empty($name)) {
- $this->detectLegacyEnvironment();
- $this->redirectToInstaller();
- }
-
- // Set default database config
- $databaseConfig = $this->getDatabaseConfig();
- $databaseConfig['database'] = $this->getDatabaseName();
- DB::setConfig($databaseConfig);
- }
-
- /**
- * Check if there's a legacy _ss_environment.php file
- *
- * @throws HTTPResponse_Exception
- */
- protected function detectLegacyEnvironment()
- {
- // Is there an _ss_environment.php file?
- if (!file_exists($this->basePath . '/_ss_environment.php') &&
- !file_exists(dirname($this->basePath) . '/_ss_environment.php')
- ) {
- return;
- }
-
- // Build error response
- $dv = new DebugView();
- $body =
- $dv->renderHeader() .
- $dv->renderInfo(
- "Configuraton Error",
- Director::absoluteBaseURL()
- ) .
- $dv->renderParagraph(
- 'You need to replace your _ss_environment.php file with a .env file, or with environment variables.
'
- . 'See the '
- . 'Environment Management docs for more information.'
- ) .
- $dv->renderFooter();
-
- // Raise error
- $response = new HTTPResponse($body, 500);
- throw new HTTPResponse_Exception($response);
- }
-
- /**
- * If missing configuration, redirect to install.php
- */
- protected function redirectToInstaller()
- {
- // Error if installer not available
- if (!file_exists($this->basePath . '/install.php')) {
- throw new HTTPResponse_Exception(
- 'SilverStripe Framework requires a $databaseConfig defined.',
- 500
- );
- }
-
- // Redirect to installer
- $response = new HTTPResponse();
- $response->redirect(Director::absoluteURL('install.php'));
- throw new HTTPResponse_Exception($response);
- }
-
- /**
- * Load database config from environment
- *
- * @return array
- */
- protected function getDatabaseConfig()
- {
- // Check global config
- global $databaseConfig;
- if (!empty($databaseConfig)) {
- return $databaseConfig;
- }
-
- /** @skipUpgrade */
- $databaseConfig = [
- "type" => getenv('SS_DATABASE_CLASS') ?: 'MySQLDatabase',
- "server" => getenv('SS_DATABASE_SERVER') ?: 'localhost',
- "username" => getenv('SS_DATABASE_USERNAME') ?: null,
- "password" => getenv('SS_DATABASE_PASSWORD') ?: null,
- ];
-
- // Set the port if called for
- $dbPort = getenv('SS_DATABASE_PORT');
- if ($dbPort) {
- $databaseConfig['port'] = $dbPort;
- }
-
- // Set the timezone if called for
- $dbTZ = getenv('SS_DATABASE_TIMEZONE');
- if ($dbTZ) {
- $databaseConfig['timezone'] = $dbTZ;
- }
-
- // For schema enabled drivers:
- $dbSchema = getenv('SS_DATABASE_SCHEMA');
- if ($dbSchema) {
- $databaseConfig["schema"] = $dbSchema;
- }
-
- // For SQlite3 memory databases (mainly for testing purposes)
- $dbMemory = getenv('SS_DATABASE_MEMORY');
- if ($dbMemory) {
- $databaseConfig["memory"] = $dbMemory;
- }
-
- // Allow database adapters to handle their own configuration
- DatabaseAdapterRegistry::autoconfigure();
- return $databaseConfig;
- }
-
- /**
- * Get name of database
- *
- * @return string
- */
- protected function getDatabaseName()
- {
- $prefix = getenv('SS_DATABASE_PREFIX') ?: 'SS_';
-
- // Check globals
- global $database;
- if (!empty($database)) {
- return $prefix.$database;
- }
- global $databaseConfig;
- if (!empty($databaseConfig['database'])) {
- return $databaseConfig['database']; // Note: Already includes prefix
- }
-
- // Check environment
- $database = getenv('SS_DATABASE_NAME');
- if ($database) {
- return $prefix.$database;
- }
-
- // Auto-detect name
- $chooseName = getenv('SS_DATABASE_CHOOSE_NAME');
- if ($chooseName) {
- // Find directory to build name from
- $loopCount = (int)$chooseName;
- $databaseDir = $this->basePath;
- for ($i = 0; $i < $loopCount-1; $i++) {
- $databaseDir = dirname($databaseDir);
- }
-
- // Build name
- $database = str_replace('.', '', basename($databaseDir));
- return $prefix.$database;
- }
-
- // no DB name (may be optional for some connectors)
- return null;
- }
-
- /**
- * Initialise PHP with default variables
- */
- protected function bootPHP()
- {
- if ($this->getEnvironment() === self::LIVE) {
- // limited to fatal errors and warnings in live mode
- error_reporting(E_ALL & ~(E_DEPRECATED | E_STRICT | E_NOTICE));
- } else {
- // Report all errors in dev / test mode
- error_reporting(E_ALL | E_STRICT);
- }
-
- global $_increase_time_limit_max;
- $_increase_time_limit_max = -1;
-
- /**
- * Ensure we have enough memory
- */
- Environment::increaseMemoryLimitTo('64M');
-
- // Ensure we don't run into xdebug's fairly conservative infinite recursion protection limit
- if (function_exists('xdebug_enable')) {
- $current = ini_get('xdebug.max_nesting_level');
- if ((int)$current < 200) {
- ini_set('xdebug.max_nesting_level', 200);
- }
- }
-
- /**
- * Set default encoding
- */
- mb_http_output('UTF-8');
- mb_internal_encoding('UTF-8');
- mb_regex_encoding('UTF-8');
-
- /**
- * Enable better garbage collection
- */
- gc_enable();
- }
-
- /**
- * @return ManifestCacheFactory
- */
- protected function buildManifestCacheFactory()
- {
- return new ManifestCacheFactory([
- 'namespace' => 'manifestcache',
- 'directory' => TempFolder::getTempFolder($this->basePath),
- ]);
- }
-
- /**
- * @return bool
- */
- protected function getIncludeTests()
- {
- return false;
- }
-
- /**
- * Boot all manifests
- *
- * @param bool $flush
- */
- protected function bootManifests($flush)
- {
- // Setup autoloader
- $this->getClassLoader()->init($this->getIncludeTests(), $flush);
-
- // Find modules
- $this->getModuleLoader()->init($this->getIncludeTests(), $flush);
-
- // Flush config
- if ($flush) {
- $config = $this->getConfigLoader()->getManifest();
- if ($config instanceof CachedConfigCollection) {
- $config->setFlush(true);
- }
- }
-
- // After loading config, boot _config.php files
- $this->getModuleLoader()->getManifest()->activateConfig();
-
- // Find default templates
- $defaultSet = $this->getThemeResourceLoader()->getSet('$default');
- if ($defaultSet instanceof ThemeManifest) {
- $defaultSet->init($this->getIncludeTests(), $flush);
- }
- }
-
- /**
- * Turn on error handling
- */
- protected function bootErrorHandling()
- {
- // Register error handler
- $errorHandler = Injector::inst()->get(ErrorHandler::class);
- $errorHandler->start();
-
- // Register error log file
- $errorLog = getenv('SS_ERROR_LOG');
- if ($errorLog) {
- $logger = Injector::inst()->get(LoggerInterface::class);
- if ($logger instanceof Logger) {
- $logger->pushHandler(new StreamHandler($this->basePath . '/' . $errorLog, Logger::WARNING));
- } else {
- user_error("SS_ERROR_LOG setting only works with Monolog, you are using another logger", E_USER_WARNING);
- }
- }
- }
-}
diff --git a/src/Core/CoreKernel.php b/src/Core/CoreKernel.php
index ac94ad6b2..d2388dce4 100644
--- a/src/Core/CoreKernel.php
+++ b/src/Core/CoreKernel.php
@@ -3,11 +3,28 @@
namespace SilverStripe\Core;
use InvalidArgumentException;
+use Monolog\Handler\StreamHandler;
+use Monolog\Logger;
+use Psr\Log\LoggerInterface;
+use SilverStripe\Config\Collections\CachedConfigCollection;
+use SilverStripe\Control\Director;
+use SilverStripe\Control\HTTPResponse;
+use SilverStripe\Control\HTTPResponse_Exception;
+use SilverStripe\Core\Cache\ManifestCacheFactory;
use SilverStripe\Core\Config\ConfigLoader;
+use SilverStripe\Core\Config\CoreConfigFactory;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Injector\InjectorLoader;
+use SilverStripe\Core\Injector\SilverStripeServiceConfigurationLocator;
use SilverStripe\Core\Manifest\ClassLoader;
+use SilverStripe\Core\Manifest\ClassManifest;
use SilverStripe\Core\Manifest\ModuleLoader;
+use SilverStripe\Core\Manifest\ModuleManifest;
+use SilverStripe\Dev\DebugView;
+use SilverStripe\Dev\Install\DatabaseAdapterRegistry;
+use SilverStripe\Logging\ErrorHandler;
+use SilverStripe\ORM\DB;
+use SilverStripe\View\ThemeManifest;
use SilverStripe\View\ThemeResourceLoader;
/**
@@ -55,8 +72,399 @@ class CoreKernel implements Kernel
*/
protected $themeResourceLoader = null;
+ protected $basePath = null;
+
+ /**
+ * Create a new kernel for this application
+ *
+ * @param string $basePath Path to base dir for this application
+ */
+ public function __construct($basePath)
+ {
+ $this->basePath = $basePath;
+
+ // Initialise the dependency injector as soon as possible, as it is
+ // subsequently used by some of the following code
+ $injectorLoader = InjectorLoader::inst();
+ $injector = new Injector(array('locator' => SilverStripeServiceConfigurationLocator::class));
+ $injectorLoader->pushManifest($injector);
+ $this->setInjectorLoader($injectorLoader);
+
+ // Manifest cache factory
+ $manifestCacheFactory = $this->buildManifestCacheFactory();
+
+ // Class loader
+ $classLoader = ClassLoader::inst();
+ $classLoader->pushManifest(new ClassManifest($basePath, $manifestCacheFactory));
+ $this->setClassLoader($classLoader);
+
+ // Module loader
+ $moduleLoader = ModuleLoader::inst();
+ $moduleManifest = new ModuleManifest($basePath, $manifestCacheFactory);
+ $moduleLoader->pushManifest($moduleManifest);
+ $this->setModuleLoader($moduleLoader);
+
+ // Config loader
+ // @todo refactor CoreConfigFactory
+ $configFactory = new CoreConfigFactory($manifestCacheFactory);
+ $configManifest = $configFactory->createRoot();
+ $configLoader = ConfigLoader::inst();
+ $configLoader->pushManifest($configManifest);
+ $this->setConfigLoader($configLoader);
+
+ // Load template manifest
+ $themeResourceLoader = ThemeResourceLoader::inst();
+ $themeResourceLoader->addSet('$default', new ThemeManifest(
+ $basePath,
+ project(),
+ $manifestCacheFactory
+ ));
+ $this->setThemeResourceLoader($themeResourceLoader);
+ }
+
+ public function getEnvironment()
+ {
+ // Check set
+ if ($this->enviroment) {
+ return $this->enviroment;
+ }
+
+ // Check saved session
+ $env = $this->sessionEnvironment();
+ if ($env) {
+ return $env;
+ }
+
+ // Check getenv
+ if ($env = getenv('SS_ENVIRONMENT_TYPE')) {
+ return $env;
+ }
+
+ return self::LIVE;
+ }
+
+ /**
+ * Check or update any temporary environment specified in the session.
+ *
+ * @return null|string
+ */
+ protected function sessionEnvironment()
+ {
+ // Check isDev in querystring
+ if (isset($_GET['isDev'])) {
+ if (isset($_SESSION)) {
+ unset($_SESSION['isTest']); // In case we are changing from test mode
+ $_SESSION['isDev'] = $_GET['isDev'];
+ }
+ return self::DEV;
+ }
+
+ // Check isTest in querystring
+ if (isset($_GET['isTest'])) {
+ if (isset($_SESSION)) {
+ unset($_SESSION['isDev']); // In case we are changing from dev mode
+ $_SESSION['isTest'] = $_GET['isTest'];
+ }
+ return self::TEST;
+ }
+
+ // Check session
+ if (!empty($_SESSION['isDev'])) {
+ return self::DEV;
+ }
+ if (!empty($_SESSION['isTest'])) {
+ return self::TEST;
+ }
+
+ // no session environment
+ return null;
+ }
+
public function boot($flush = false)
{
+ $this->bootPHP();
+ $this->bootManifests($flush);
+ $this->bootErrorHandling();
+ $this->bootDatabase();
+ }
+
+ /**
+ * Configure database
+ *
+ * @throws HTTPResponse_Exception
+ */
+ protected function bootDatabase()
+ {
+ // Check if a DB is named
+ $name = $this->getDatabaseName();
+
+ // Gracefully fail if no DB is configured
+ if (empty($name)) {
+ $this->detectLegacyEnvironment();
+ $this->redirectToInstaller();
+ }
+
+ // Set default database config
+ $databaseConfig = $this->getDatabaseConfig();
+ $databaseConfig['database'] = $this->getDatabaseName();
+ DB::setConfig($databaseConfig);
+ }
+
+ /**
+ * Check if there's a legacy _ss_environment.php file
+ *
+ * @throws HTTPResponse_Exception
+ */
+ protected function detectLegacyEnvironment()
+ {
+ // Is there an _ss_environment.php file?
+ if (!file_exists($this->basePath . '/_ss_environment.php') &&
+ !file_exists(dirname($this->basePath) . '/_ss_environment.php')
+ ) {
+ return;
+ }
+
+ // Build error response
+ $dv = new DebugView();
+ $body =
+ $dv->renderHeader() .
+ $dv->renderInfo(
+ "Configuraton Error",
+ Director::absoluteBaseURL()
+ ) .
+ $dv->renderParagraph(
+ 'You need to replace your _ss_environment.php file with a .env file, or with environment variables.
'
+ . 'See the '
+ . 'Environment Management docs for more information.'
+ ) .
+ $dv->renderFooter();
+
+ // Raise error
+ $response = new HTTPResponse($body, 500);
+ throw new HTTPResponse_Exception($response);
+ }
+
+ /**
+ * If missing configuration, redirect to install.php
+ */
+ protected function redirectToInstaller()
+ {
+ // Error if installer not available
+ if (!file_exists($this->basePath . '/install.php')) {
+ throw new HTTPResponse_Exception(
+ 'SilverStripe Framework requires a $databaseConfig defined.',
+ 500
+ );
+ }
+
+ // Redirect to installer
+ $response = new HTTPResponse();
+ $response->redirect(Director::absoluteURL('install.php'));
+ throw new HTTPResponse_Exception($response);
+ }
+
+ /**
+ * Load database config from environment
+ *
+ * @return array
+ */
+ protected function getDatabaseConfig()
+ {
+ // Check global config
+ global $databaseConfig;
+ if (!empty($databaseConfig)) {
+ return $databaseConfig;
+ }
+
+ /** @skipUpgrade */
+ $databaseConfig = [
+ "type" => getenv('SS_DATABASE_CLASS') ?: 'MySQLDatabase',
+ "server" => getenv('SS_DATABASE_SERVER') ?: 'localhost',
+ "username" => getenv('SS_DATABASE_USERNAME') ?: null,
+ "password" => getenv('SS_DATABASE_PASSWORD') ?: null,
+ ];
+
+ // Set the port if called for
+ $dbPort = getenv('SS_DATABASE_PORT');
+ if ($dbPort) {
+ $databaseConfig['port'] = $dbPort;
+ }
+
+ // Set the timezone if called for
+ $dbTZ = getenv('SS_DATABASE_TIMEZONE');
+ if ($dbTZ) {
+ $databaseConfig['timezone'] = $dbTZ;
+ }
+
+ // For schema enabled drivers:
+ $dbSchema = getenv('SS_DATABASE_SCHEMA');
+ if ($dbSchema) {
+ $databaseConfig["schema"] = $dbSchema;
+ }
+
+ // For SQlite3 memory databases (mainly for testing purposes)
+ $dbMemory = getenv('SS_DATABASE_MEMORY');
+ if ($dbMemory) {
+ $databaseConfig["memory"] = $dbMemory;
+ }
+
+ // Allow database adapters to handle their own configuration
+ DatabaseAdapterRegistry::autoconfigure();
+ return $databaseConfig;
+ }
+
+ /**
+ * Get name of database
+ *
+ * @return string
+ */
+ protected function getDatabaseName()
+ {
+ $prefix = getenv('SS_DATABASE_PREFIX') ?: 'SS_';
+
+ // Check globals
+ global $database;
+ if (!empty($database)) {
+ return $prefix.$database;
+ }
+ global $databaseConfig;
+ if (!empty($databaseConfig['database'])) {
+ return $databaseConfig['database']; // Note: Already includes prefix
+ }
+
+ // Check environment
+ $database = getenv('SS_DATABASE_NAME');
+ if ($database) {
+ return $prefix.$database;
+ }
+
+ // Auto-detect name
+ $chooseName = getenv('SS_DATABASE_CHOOSE_NAME');
+ if ($chooseName) {
+ // Find directory to build name from
+ $loopCount = (int)$chooseName;
+ $databaseDir = $this->basePath;
+ for ($i = 0; $i < $loopCount-1; $i++) {
+ $databaseDir = dirname($databaseDir);
+ }
+
+ // Build name
+ $database = str_replace('.', '', basename($databaseDir));
+ return $prefix.$database;
+ }
+
+ // no DB name (may be optional for some connectors)
+ return null;
+ }
+
+ /**
+ * Initialise PHP with default variables
+ */
+ protected function bootPHP()
+ {
+ if ($this->getEnvironment() === self::LIVE) {
+ // limited to fatal errors and warnings in live mode
+ error_reporting(E_ALL & ~(E_DEPRECATED | E_STRICT | E_NOTICE));
+ } else {
+ // Report all errors in dev / test mode
+ error_reporting(E_ALL | E_STRICT);
+ }
+
+ /**
+ * Ensure we have enough memory
+ */
+ Environment::increaseMemoryLimitTo('64M');
+
+ // Ensure we don't run into xdebug's fairly conservative infinite recursion protection limit
+ if (function_exists('xdebug_enable')) {
+ $current = ini_get('xdebug.max_nesting_level');
+ if ((int)$current < 200) {
+ ini_set('xdebug.max_nesting_level', 200);
+ }
+ }
+
+ /**
+ * Set default encoding
+ */
+ mb_http_output('UTF-8');
+ mb_internal_encoding('UTF-8');
+ mb_regex_encoding('UTF-8');
+
+ /**
+ * Enable better garbage collection
+ */
+ gc_enable();
+ }
+
+ /**
+ * @return ManifestCacheFactory
+ */
+ protected function buildManifestCacheFactory()
+ {
+ return new ManifestCacheFactory([
+ 'namespace' => 'manifestcache',
+ 'directory' => TempFolder::getTempFolder($this->basePath),
+ ]);
+ }
+
+ /**
+ * @return bool
+ */
+ protected function getIncludeTests()
+ {
+ return false;
+ }
+
+ /**
+ * Boot all manifests
+ *
+ * @param bool $flush
+ */
+ protected function bootManifests($flush)
+ {
+ // Setup autoloader
+ $this->getClassLoader()->init($this->getIncludeTests(), $flush);
+
+ // Find modules
+ $this->getModuleLoader()->init($this->getIncludeTests(), $flush);
+
+ // Flush config
+ if ($flush) {
+ $config = $this->getConfigLoader()->getManifest();
+ if ($config instanceof CachedConfigCollection) {
+ $config->setFlush(true);
+ }
+ }
+
+ // After loading config, boot _config.php files
+ $this->getModuleLoader()->getManifest()->activateConfig();
+
+ // Find default templates
+ $defaultSet = $this->getThemeResourceLoader()->getSet('$default');
+ if ($defaultSet instanceof ThemeManifest) {
+ $defaultSet->init($this->getIncludeTests(), $flush);
+ }
+ }
+
+ /**
+ * Turn on error handling
+ */
+ protected function bootErrorHandling()
+ {
+ // Register error handler
+ $errorHandler = Injector::inst()->get(ErrorHandler::class);
+ $errorHandler->start();
+
+ // Register error log file
+ $errorLog = getenv('SS_ERROR_LOG');
+ if ($errorLog) {
+ $logger = Injector::inst()->get(LoggerInterface::class);
+ if ($logger instanceof Logger) {
+ $logger->pushHandler(new StreamHandler($this->basePath . '/' . $errorLog, Logger::WARNING));
+ } else {
+ user_error("SS_ERROR_LOG setting only works with Monolog, you are using another logger", E_USER_WARNING);
+ }
+ }
}
public function shutdown()
@@ -130,11 +538,6 @@ class CoreKernel implements Kernel
return $this;
}
- public function getEnvironment()
- {
- return $this->enviroment ?: self::LIVE;
- }
-
public function setEnvironment($environment)
{
if (!in_array($environment, [self::DEV, self::TEST, self::LIVE, null])) {
diff --git a/src/Core/Environment.php b/src/Core/Environment.php
index f7d5aadb7..c32b9a0f5 100644
--- a/src/Core/Environment.php
+++ b/src/Core/Environment.php
@@ -48,7 +48,7 @@ class Environment
/**
* Increase the memory limit to the given level if it's currently too low.
- * Only increases up to the maximum defined in {@link set_increase_memory_limit_max()},
+ * Only increases up to the maximum defined in {@link setMemoryLimitMax()},
* and defaults to the 'memory_limit' setting in the PHP configuration.
*
* @param string|float|int $memoryLimit A memory limit string, such as "64M". If omitted, unlimited memory will be set.
@@ -81,7 +81,7 @@ class Environment
}
/**
- * Set the maximum allowed value for {@link increase_memory_limit_to()}.
+ * Set the maximum allowed value for {@link increaseMemoryLimitTo()}.
* The same result can also be achieved through 'suhosin.memory_limit'
* if PHP is running with the Suhosin system.
*
@@ -109,7 +109,7 @@ class Environment
/**
* Increase the time limit of this script. By default, the time will be unlimited.
* Only works if 'safe_mode' is off in the PHP configuration.
- * Only values up to {@link get_increase_time_limit_max()} are allowed.
+ * Only values up to {@link getTimeLimitMax()} are allowed.
*
* @param int $timeLimit The time limit in seconds. If omitted, no time limit will be set.
* @return Boolean TRUE indicates a successful change, FALSE a denied change.
@@ -135,7 +135,7 @@ class Environment
}
/**
- * Set the maximum allowed value for {@link increase_timeLimit_to()};
+ * Set the maximum allowed value for {@link increaseTimeLimitTo()};
*
* @param int $timeLimit Limit in seconds
*/
diff --git a/src/Dev/BulkLoader.php b/src/Dev/BulkLoader.php
index 3658b0a96..7242e0931 100644
--- a/src/Dev/BulkLoader.php
+++ b/src/Dev/BulkLoader.php
@@ -2,6 +2,7 @@
namespace SilverStripe\Dev;
+use SilverStripe\Core\Environment;
use SilverStripe\ORM\DataObject;
use SilverStripe\View\ViewableData;
@@ -142,8 +143,8 @@ abstract class BulkLoader extends ViewableData
*/
public function load($filepath)
{
- increase_time_limit_to(3600);
- increase_memory_limit_to('512M');
+ Environment::increaseTimeLimitTo(3600);
+ Environment::increaseMemoryLimitTo('512M');
//get all instances of the to be imported data object
if ($this->deleteExistingRecords) {
diff --git a/src/Dev/Install/Installer.php b/src/Dev/Install/Installer.php
index ef256b60f..47e6871ca 100644
--- a/src/Dev/Install/Installer.php
+++ b/src/Dev/Install/Installer.php
@@ -5,7 +5,7 @@ namespace SilverStripe\Dev\Install;
use Exception;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\Session;
-use SilverStripe\Core\AppKernel;
+use SilverStripe\Core\CoreKernel;
use SilverStripe\Core\HTTPApplication;
use SilverStripe\Core\Kernel;
use SilverStripe\Core\Startup\ParameterConfirmationToken;
@@ -215,7 +215,7 @@ PHP
$request->setSession($session);
// Install kernel (fix to dev)
- $kernel = new AppKernel(BASE_PATH);
+ $kernel = new CoreKernel(BASE_PATH);
$kernel->setEnvironment(Kernel::DEV);
$app = new HTTPApplication($kernel);
diff --git a/src/Dev/SapphireTest.php b/src/Dev/SapphireTest.php
index dd80b2210..4baa0d733 100644
--- a/src/Dev/SapphireTest.php
+++ b/src/Dev/SapphireTest.php
@@ -19,7 +19,7 @@ use SilverStripe\Core\HTTPApplication;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Injector\InjectorLoader;
use SilverStripe\Core\Manifest\ClassLoader;
-use SilverStripe\Core\TestKernel;
+use SilverStripe\Dev\TestKernel;
use SilverStripe\Dev\State\SapphireTestState;
use SilverStripe\Dev\State\TestState;
use SilverStripe\i18n\i18n;
diff --git a/src/Dev/State/KernelTestState.php b/src/Dev/State/KernelTestState.php
index 14e78aa61..fbb3a088e 100644
--- a/src/Dev/State/KernelTestState.php
+++ b/src/Dev/State/KernelTestState.php
@@ -4,7 +4,7 @@ namespace SilverStripe\Dev\State;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Kernel;
-use SilverStripe\Core\TestKernel;
+use SilverStripe\Dev\TestKernel;
use SilverStripe\Dev\SapphireTest;
/**
@@ -22,7 +22,7 @@ class KernelTestState implements TestState
/**
* Get active Kernel instance
*
- * @return TestKernel
+ * @return \SilverStripe\Dev\TestKernel
*/
protected function kernel()
{
diff --git a/src/Dev/Tasks/i18nTextCollectorTask.php b/src/Dev/Tasks/i18nTextCollectorTask.php
index fdfd766b0..6397f6302 100644
--- a/src/Dev/Tasks/i18nTextCollectorTask.php
+++ b/src/Dev/Tasks/i18nTextCollectorTask.php
@@ -3,6 +3,7 @@
namespace SilverStripe\Dev\Tasks;
use SilverStripe\Control\HTTPRequest;
+use SilverStripe\Core\Environment;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Dev\Debug;
use SilverStripe\Dev\BuildTask;
@@ -40,7 +41,7 @@ class i18nTextCollectorTask extends BuildTask
*/
public function run($request)
{
- increase_time_limit_to();
+ Environment::increaseTimeLimitTo();
$collector = i18nTextCollector::create($request->getVar('locale'));
$merge = $this->getIsMerge($request);
diff --git a/src/Core/TestKernel.php b/src/Dev/TestKernel.php
similarity index 89%
rename from src/Core/TestKernel.php
rename to src/Dev/TestKernel.php
index 7e97ae2ea..67229f5ca 100644
--- a/src/Core/TestKernel.php
+++ b/src/Dev/TestKernel.php
@@ -1,11 +1,13 @@
getManifest()->regenerate(false);
diff --git a/src/includes/functions.php b/src/includes/functions.php
index 83f1a61d4..dabab3298 100644
--- a/src/includes/functions.php
+++ b/src/includes/functions.php
@@ -36,6 +36,10 @@ function singleton($className)
function project()
{
global $project;
+ // Set default project
+ if (empty($project) && file_exists(BASE_PATH . '/mysite')) {
+ $project = 'mysite';
+ }
return $project;
}