1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-06-05 22:14:59 +02:00

[ticket/14306] Automatically enable a safe mode when container building fails

PHPBB3-14306
This commit is contained in:
Tristan Darricau 2015-12-11 21:31:27 +01:00
parent f6524f4902
commit 78349ed80f
3 changed files with 85 additions and 64 deletions

View File

@ -146,3 +146,11 @@ function popup(url, width, height, name)
<div id="main"> <div id="main">
<div class="main"> <div class="main">
<!-- IF CONTAINER_EXCEPTION !== false -->
<div class="errorbox">
<p>{L_CONTAINER_EXCEPTION}</p>
<p>{L_CONTAINER_EXCEPTION_DETAIL}</p>
<p>Exception message: {{ CONTAINER_EXCEPTION.getMessage() }}</p>
<pre>{{ CONTAINER_EXCEPTION.getTraceAsString() }}</pre>
</div>
<!-- ENDIF -->

View File

@ -26,7 +26,7 @@ function adm_page_header($page_title)
{ {
global $config, $db, $user, $template; global $config, $db, $user, $template;
global $phpbb_root_path, $phpbb_admin_path, $phpEx, $SID, $_SID; global $phpbb_root_path, $phpbb_admin_path, $phpEx, $SID, $_SID;
global $phpbb_dispatcher; global $phpbb_dispatcher, $phpbb_container;
if (defined('HEADER_INC')) if (defined('HEADER_INC'))
{ {
@ -105,6 +105,8 @@ function adm_page_header($page_title)
'S_CONTENT_ENCODING' => 'UTF-8', 'S_CONTENT_ENCODING' => 'UTF-8',
'S_CONTENT_FLOW_BEGIN' => ($user->lang['DIRECTION'] == 'ltr') ? 'left' : 'right', 'S_CONTENT_FLOW_BEGIN' => ($user->lang['DIRECTION'] == 'ltr') ? 'left' : 'right',
'S_CONTENT_FLOW_END' => ($user->lang['DIRECTION'] == 'ltr') ? 'right' : 'left', 'S_CONTENT_FLOW_END' => ($user->lang['DIRECTION'] == 'ltr') ? 'right' : 'left',
'CONTAINER_EXCEPTION' => $phpbb_container->hasParameter('container_exception') ? $phpbb_container->getParameter('container_exception') : false,
)); ));
// An array of http headers that phpbb will set. The following event may override these. // An array of http headers that phpbb will set. The following event may override these.

View File

@ -90,7 +90,7 @@ class container_builder
* *
* @var array * @var array
*/ */
protected $custom_parameters = null; protected $custom_parameters = [];
/** /**
* @var \phpbb\config_php_file * @var \phpbb\config_php_file
@ -126,67 +126,80 @@ class container_builder
*/ */
public function get_container() public function get_container()
{ {
$container_filename = $this->get_container_filename(); try {
$config_cache = new ConfigCache($container_filename, defined('DEBUG')); $container_filename = $this->get_container_filename();
if ($this->use_cache && $config_cache->isFresh()) $config_cache = new ConfigCache($container_filename, defined('DEBUG'));
{ if ($this->use_cache && $config_cache->isFresh())
require($config_cache->getPath());
$this->container = new \phpbb_cache_container();
}
else
{
$this->container_extensions = array(new extension\core($this->get_config_path()));
if ($this->use_extensions)
{ {
$this->load_extensions(); require($config_cache->getPath());
$this->container = new \phpbb_cache_container();
} }
else
// Inject the config
if ($this->config_php_file)
{ {
$this->container_extensions[] = new extension\config($this->config_php_file); $this->container_extensions = array(new extension\core($this->get_config_path()));
}
$this->container = $this->create_container($this->container_extensions); if ($this->use_extensions)
// Easy collections through tags
$this->container->addCompilerPass(new pass\collection_pass());
// Event listeners "phpBB style"
$this->container->addCompilerPass(new RegisterListenersPass('dispatcher', 'event.listener_listener', 'event.listener'));
// Event listeners "Symfony style"
$this->container->addCompilerPass(new RegisterListenersPass('dispatcher'));
if ($this->use_extensions)
{
$this->register_ext_compiler_pass();
}
$filesystem = new filesystem();
$loader = new YamlFileLoader($this->container, new FileLocator($filesystem->realpath($this->get_config_path())));
$loader->load($this->container->getParameter('core.environment') . '/config.yml');
$this->inject_custom_parameters();
if ($this->compile_container)
{
$this->container->compile();
if ($this->use_cache)
{ {
$this->dump_container($config_cache); $this->load_extensions();
}
// Inject the config
if ($this->config_php_file)
{
$this->container_extensions[] = new extension\config($this->config_php_file);
}
$this->container = $this->create_container($this->container_extensions);
// Easy collections through tags
$this->container->addCompilerPass(new pass\collection_pass());
// Event listeners "phpBB style"
$this->container->addCompilerPass(new RegisterListenersPass('dispatcher', 'event.listener_listener', 'event.listener'));
// Event listeners "Symfony style"
$this->container->addCompilerPass(new RegisterListenersPass('dispatcher'));
if ($this->use_extensions)
{
$this->register_ext_compiler_pass();
}
$filesystem = new filesystem();
$loader = new YamlFileLoader($this->container, new FileLocator($filesystem->realpath($this->get_config_path())));
$loader->load($this->container->getParameter('core.environment') . '/config.yml');
$this->inject_custom_parameters();
if ($this->compile_container)
{
$this->container->compile();
if ($this->use_cache)
{
$this->dump_container($config_cache);
}
} }
} }
}
if ($this->compile_container && $this->config_php_file) if ($this->compile_container && $this->config_php_file)
{
$this->container->set('config.php', $this->config_php_file);
}
return $this->container;
}
catch (\Exception $e)
{ {
$this->container->set('config.php', $this->config_php_file); return $this
->without_extensions()
->without_cache()
->with_custom_parameters(array_merge($this->custom_parameters, [
'container_exception' => $e,
]))
->get_container()
;
} }
return $this->container;
} }
/** /**
@ -451,13 +464,11 @@ class container_builder
*/ */
protected function inject_custom_parameters() protected function inject_custom_parameters()
{ {
if ($this->custom_parameters !== null) foreach ($this->custom_parameters as $key => $value)
{ {
foreach ($this->custom_parameters as $key => $value) $this->container->setParameter($key, $value);
{
$this->container->setParameter($key, $value);
}
} }
} }
/** /**