PDF rausgenommen
This commit is contained in:
673
msd2/phpBB3/phpbb/di/container_builder.php
Normal file
673
msd2/phpBB3/phpbb/di/container_builder.php
Normal file
@ -0,0 +1,673 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* This file is part of the phpBB Forum Software package.
|
||||
*
|
||||
* @copyright (c) phpBB Limited <https://www.phpbb.com>
|
||||
* @license GNU General Public License, version 2 (GPL-2.0)
|
||||
*
|
||||
* For full copyright and license information, please see
|
||||
* the docs/CREDITS.txt file.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace phpbb\di;
|
||||
|
||||
use phpbb\filesystem\filesystem;
|
||||
use Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper\ProxyDumper;
|
||||
use Symfony\Component\Config\ConfigCache;
|
||||
use Symfony\Component\Config\FileLocator;
|
||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
|
||||
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
|
||||
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
|
||||
use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass;
|
||||
use Symfony\Component\Filesystem\Exception\IOException;
|
||||
use Symfony\Component\Finder\Finder;
|
||||
use Symfony\Component\HttpKernel\DependencyInjection\MergeExtensionConfigurationPass;
|
||||
|
||||
class container_builder
|
||||
{
|
||||
/**
|
||||
* @var string The environment to use.
|
||||
*/
|
||||
protected $environment;
|
||||
|
||||
/**
|
||||
* @var string phpBB Root Path
|
||||
*/
|
||||
protected $phpbb_root_path;
|
||||
|
||||
/**
|
||||
* @var string php file extension
|
||||
*/
|
||||
protected $php_ext;
|
||||
|
||||
/**
|
||||
* The container under construction
|
||||
*
|
||||
* @var ContainerBuilder
|
||||
*/
|
||||
protected $container;
|
||||
|
||||
/**
|
||||
* @var \phpbb\db\driver\driver_interface
|
||||
*/
|
||||
protected $dbal_connection = null;
|
||||
|
||||
/**
|
||||
* Indicates whether extensions should be used (default to true).
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $use_extensions = true;
|
||||
|
||||
/**
|
||||
* Defines a custom path to find the configuration of the container (default to $this->phpbb_root_path . 'config')
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $config_path = null;
|
||||
|
||||
/**
|
||||
* Indicates whether the container should be dumped to the filesystem (default to true).
|
||||
*
|
||||
* If DEBUG_CONTAINER is set this option is ignored and a new container is build.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $use_cache = true;
|
||||
|
||||
/**
|
||||
* Indicates if the container should be compiled automatically (default to true).
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $compile_container = true;
|
||||
|
||||
/**
|
||||
* Custom parameters to inject into the container.
|
||||
*
|
||||
* Default to:
|
||||
* array(
|
||||
* 'core.root_path', $this->phpbb_root_path,
|
||||
* 'core.php_ext', $this->php_ext,
|
||||
* );
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $custom_parameters = [];
|
||||
|
||||
/**
|
||||
* @var \phpbb\config_php_file
|
||||
*/
|
||||
protected $config_php_file;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $cache_dir;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $container_extensions;
|
||||
|
||||
/** @var \Exception */
|
||||
private $build_exception;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $phpbb_root_path Path to the phpbb includes directory.
|
||||
* @param string $php_ext php file extension
|
||||
*/
|
||||
public function __construct($phpbb_root_path, $php_ext)
|
||||
{
|
||||
$this->phpbb_root_path = $phpbb_root_path;
|
||||
$this->php_ext = $php_ext;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build and return a new Container respecting the current configuration
|
||||
*
|
||||
* @return \phpbb_cache_container|ContainerBuilder
|
||||
*/
|
||||
public function get_container()
|
||||
{
|
||||
try
|
||||
{
|
||||
$container_filename = $this->get_container_filename();
|
||||
$config_cache = new ConfigCache($container_filename, defined('DEBUG'));
|
||||
if ($this->use_cache && $config_cache->isFresh())
|
||||
{
|
||||
if ($this->use_extensions)
|
||||
{
|
||||
$autoload_cache = new ConfigCache($this->get_autoload_filename(), defined('DEBUG'));
|
||||
if (!$autoload_cache->isFresh())
|
||||
{
|
||||
// autoload cache should be refreshed
|
||||
$this->load_extensions();
|
||||
}
|
||||
|
||||
require($this->get_autoload_filename());
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
// 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)
|
||||
{
|
||||
$this->container->set('config.php', $this->config_php_file);
|
||||
}
|
||||
|
||||
$this->inject_dbal_driver();
|
||||
|
||||
return $this->container;
|
||||
}
|
||||
catch (\Exception $e)
|
||||
{
|
||||
// Don't try to recover if we are in the development environment
|
||||
if ($this->get_environment() === 'development')
|
||||
{
|
||||
throw $e;
|
||||
}
|
||||
|
||||
if ($this->build_exception === null)
|
||||
{
|
||||
$this->build_exception = $e;
|
||||
|
||||
return $this
|
||||
->without_extensions()
|
||||
->without_cache()
|
||||
->with_custom_parameters(array_merge($this->custom_parameters, [
|
||||
'container_exception' => $e,
|
||||
]))
|
||||
->get_container();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Rethrow the original exception if it's still failing
|
||||
throw $this->build_exception;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable the extensions.
|
||||
*
|
||||
* @param string $environment The environment to use
|
||||
* @return $this
|
||||
*/
|
||||
public function with_environment($environment)
|
||||
{
|
||||
$this->environment = $environment;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable the extensions.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function with_extensions()
|
||||
{
|
||||
$this->use_extensions = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable the extensions.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function without_extensions()
|
||||
{
|
||||
$this->use_extensions = false;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable the caching of the container.
|
||||
*
|
||||
* If DEBUG_CONTAINER is set this option is ignored and a new container is build.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function with_cache()
|
||||
{
|
||||
$this->use_cache = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable the caching of the container.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function without_cache()
|
||||
{
|
||||
$this->use_cache = false;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the cache directory.
|
||||
*
|
||||
* @param string $cache_dir The cache directory.
|
||||
* @return $this
|
||||
*/
|
||||
public function with_cache_dir($cache_dir)
|
||||
{
|
||||
$this->cache_dir = $cache_dir;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable the compilation of the container.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function with_compiled_container()
|
||||
{
|
||||
$this->compile_container = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable the compilation of the container.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function without_compiled_container()
|
||||
{
|
||||
$this->compile_container = false;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a custom path to find the configuration of the container.
|
||||
*
|
||||
* @param string $config_path
|
||||
* @return $this
|
||||
*/
|
||||
public function with_config_path($config_path)
|
||||
{
|
||||
$this->config_path = $config_path;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set custom parameters to inject into the container.
|
||||
*
|
||||
* @param array $custom_parameters
|
||||
* @return $this
|
||||
*/
|
||||
public function with_custom_parameters($custom_parameters)
|
||||
{
|
||||
$this->custom_parameters = $custom_parameters;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set custom parameters to inject into the container.
|
||||
*
|
||||
* @param \phpbb\config_php_file $config_php_file
|
||||
* @return $this
|
||||
*/
|
||||
public function with_config(\phpbb\config_php_file $config_php_file)
|
||||
{
|
||||
$this->config_php_file = $config_php_file;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the path to the container configuration (default: root_path/config)
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function get_config_path()
|
||||
{
|
||||
return $this->config_path ?: $this->phpbb_root_path . 'config';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the path to the cache directory (default: root_path/cache/environment).
|
||||
*
|
||||
* @return string Path to the cache directory.
|
||||
*/
|
||||
protected function get_cache_dir()
|
||||
{
|
||||
return $this->cache_dir ?: $this->phpbb_root_path . 'cache/' . $this->get_environment() . '/';
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the enabled extensions.
|
||||
*/
|
||||
protected function load_extensions()
|
||||
{
|
||||
if ($this->config_php_file !== null)
|
||||
{
|
||||
// Build an intermediate container to load the ext list from the database
|
||||
$container_builder = new container_builder($this->phpbb_root_path, $this->php_ext);
|
||||
$ext_container = $container_builder
|
||||
->without_cache()
|
||||
->without_extensions()
|
||||
->with_config($this->config_php_file)
|
||||
->with_config_path($this->get_config_path())
|
||||
->with_environment('production')
|
||||
->without_compiled_container()
|
||||
->get_container()
|
||||
;
|
||||
|
||||
$ext_container->register('cache.driver', '\\phpbb\\cache\\driver\\dummy');
|
||||
$ext_container->compile();
|
||||
|
||||
$extensions = $ext_container->get('ext.manager')->all_enabled();
|
||||
|
||||
// Load each extension found
|
||||
$autoloaders = '<?php
|
||||
/**
|
||||
* Loads all extensions custom auto-loaders.
|
||||
*
|
||||
* This file has been auto-generated
|
||||
* by phpBB while loading the extensions.
|
||||
*/
|
||||
|
||||
';
|
||||
foreach ($extensions as $ext_name => $path)
|
||||
{
|
||||
$extension_class = '\\' . str_replace('/', '\\', $ext_name) . '\\di\\extension';
|
||||
|
||||
if (!class_exists($extension_class))
|
||||
{
|
||||
$extension_class = '\\phpbb\\extension\\di\\extension_base';
|
||||
}
|
||||
|
||||
$this->container_extensions[] = new $extension_class($ext_name, $path);
|
||||
|
||||
// Load extension autoloader
|
||||
$filename = $path . 'vendor/autoload.php';
|
||||
if (file_exists($filename))
|
||||
{
|
||||
$autoloaders .= "require('{$filename}');\n";
|
||||
}
|
||||
}
|
||||
|
||||
$configCache = new ConfigCache($this->get_autoload_filename(), false);
|
||||
$configCache->write($autoloaders);
|
||||
|
||||
require($this->get_autoload_filename());
|
||||
}
|
||||
else
|
||||
{
|
||||
// To load the extensions we need the database credentials.
|
||||
// Automatically disable the extensions if we don't have them.
|
||||
$this->use_extensions = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump the container to the disk.
|
||||
*
|
||||
* @param ConfigCache $cache The config cache
|
||||
*/
|
||||
protected function dump_container($cache)
|
||||
{
|
||||
try
|
||||
{
|
||||
$dumper = new PhpDumper($this->container);
|
||||
$proxy_dumper = new ProxyDumper();
|
||||
$dumper->setProxyDumper($proxy_dumper);
|
||||
|
||||
$cached_container_dump = $dumper->dump(array(
|
||||
'class' => 'phpbb_cache_container',
|
||||
'base_class' => 'Symfony\\Component\\DependencyInjection\\ContainerBuilder',
|
||||
));
|
||||
|
||||
$cache->write($cached_container_dump, $this->container->getResources());
|
||||
}
|
||||
catch (IOException $e)
|
||||
{
|
||||
// Don't fail if the cache isn't writeable
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the ContainerBuilder object
|
||||
*
|
||||
* @param array $extensions Array of Container extension objects
|
||||
* @return ContainerBuilder object
|
||||
*/
|
||||
protected function create_container(array $extensions)
|
||||
{
|
||||
$container = new ContainerBuilder(new ParameterBag($this->get_core_parameters()));
|
||||
$container->setProxyInstantiator(new proxy_instantiator($this->get_cache_dir()));
|
||||
|
||||
$extensions_alias = array();
|
||||
|
||||
foreach ($extensions as $extension)
|
||||
{
|
||||
$container->registerExtension($extension);
|
||||
$extensions_alias[] = $extension->getAlias();
|
||||
}
|
||||
|
||||
$container->getCompilerPassConfig()->setMergePass(new MergeExtensionConfigurationPass($extensions_alias));
|
||||
|
||||
return $container;
|
||||
}
|
||||
|
||||
/**
|
||||
* Inject the customs parameters into the container
|
||||
*/
|
||||
protected function inject_custom_parameters()
|
||||
{
|
||||
foreach ($this->custom_parameters as $key => $value)
|
||||
{
|
||||
$this->container->setParameter($key, $value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Inject the dbal connection driver into container
|
||||
*/
|
||||
protected function inject_dbal_driver()
|
||||
{
|
||||
if (empty($this->config_php_file))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$config_data = $this->config_php_file->get_all();
|
||||
if (!empty($config_data))
|
||||
{
|
||||
if ($this->dbal_connection === null)
|
||||
{
|
||||
$dbal_driver_class = $this->config_php_file->convert_30_dbms_to_31($this->config_php_file->get('dbms'));
|
||||
/** @var \phpbb\db\driver\driver_interface $dbal_connection */
|
||||
$this->dbal_connection = new $dbal_driver_class();
|
||||
$this->dbal_connection->sql_connect(
|
||||
$this->config_php_file->get('dbhost'),
|
||||
$this->config_php_file->get('dbuser'),
|
||||
$this->config_php_file->get('dbpasswd'),
|
||||
$this->config_php_file->get('dbname'),
|
||||
$this->config_php_file->get('dbport'),
|
||||
false,
|
||||
defined('PHPBB_DB_NEW_LINK') && PHPBB_DB_NEW_LINK
|
||||
);
|
||||
}
|
||||
$this->container->set('dbal.conn.driver', $this->dbal_connection);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the core parameters.
|
||||
*
|
||||
* @return array An array of core parameters
|
||||
*/
|
||||
protected function get_core_parameters()
|
||||
{
|
||||
return array_merge(
|
||||
array(
|
||||
'core.root_path' => $this->phpbb_root_path,
|
||||
'core.php_ext' => $this->php_ext,
|
||||
'core.environment' => $this->get_environment(),
|
||||
'core.debug' => defined('DEBUG') ? DEBUG : false,
|
||||
'core.cache_dir' => $this->get_cache_dir(),
|
||||
),
|
||||
$this->get_env_parameters()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the environment parameters.
|
||||
*
|
||||
* Only the parameters starting with "PHPBB__" are considered.
|
||||
*
|
||||
* @return array An array of parameters
|
||||
*/
|
||||
protected function get_env_parameters()
|
||||
{
|
||||
$parameters = array();
|
||||
foreach ($_SERVER as $key => $value)
|
||||
{
|
||||
if (0 === strpos($key, 'PHPBB__'))
|
||||
{
|
||||
$parameters[strtolower(str_replace('__', '.', substr($key, 9)))] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $parameters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the filename under which the dumped container will be stored.
|
||||
*
|
||||
* @return string Path for dumped container
|
||||
*/
|
||||
protected function get_container_filename()
|
||||
{
|
||||
$container_params = [
|
||||
'phpbb_root_path' => $this->phpbb_root_path,
|
||||
'use_extensions' => $this->use_extensions,
|
||||
'config_path' => $this->config_path,
|
||||
];
|
||||
|
||||
return $this->get_cache_dir() . 'container_' . md5(implode(',', $container_params)) . '.' . $this->php_ext;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the filename under which the dumped extensions autoloader will be stored.
|
||||
*
|
||||
* @return string Path for dumped extensions autoloader
|
||||
*/
|
||||
protected function get_autoload_filename()
|
||||
{
|
||||
$container_params = [
|
||||
'phpbb_root_path' => $this->phpbb_root_path,
|
||||
'use_extensions' => $this->use_extensions,
|
||||
'config_path' => $this->config_path,
|
||||
];
|
||||
|
||||
return $this->get_cache_dir() . 'autoload_' . md5(implode(',', $container_params)) . '.' . $this->php_ext;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the name of the current environment.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function get_environment()
|
||||
{
|
||||
return $this->environment ?: PHPBB_ENVIRONMENT;
|
||||
}
|
||||
|
||||
private function register_ext_compiler_pass()
|
||||
{
|
||||
$finder = new Finder();
|
||||
$finder
|
||||
->name('*_pass.php')
|
||||
->path('di/pass')
|
||||
->files()
|
||||
->ignoreDotFiles(true)
|
||||
->ignoreUnreadableDirs(true)
|
||||
->ignoreVCS(true)
|
||||
->followLinks()
|
||||
->in($this->phpbb_root_path . 'ext')
|
||||
;
|
||||
|
||||
/** @var \SplFileInfo $pass */
|
||||
foreach ($finder as $pass)
|
||||
{
|
||||
$filename = $pass->getPathname();
|
||||
$filename = substr($filename, 0, -strlen('.' . $pass->getExtension()));
|
||||
$filename = str_replace(DIRECTORY_SEPARATOR, '/', $filename);
|
||||
$className = preg_replace('#^.*ext/#', '', $filename);
|
||||
$className = '\\' . str_replace('/', '\\', $className);
|
||||
|
||||
if (class_exists($className) && in_array('Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface', class_implements($className), true))
|
||||
{
|
||||
$this->container->addCompilerPass(new $className());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
83
msd2/phpBB3/phpbb/di/extension/config.php
Normal file
83
msd2/phpBB3/phpbb/di/extension/config.php
Normal file
@ -0,0 +1,83 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* This file is part of the phpBB Forum Software package.
|
||||
*
|
||||
* @copyright (c) phpBB Limited <https://www.phpbb.com>
|
||||
* @license GNU General Public License, version 2 (GPL-2.0)
|
||||
*
|
||||
* For full copyright and license information, please see
|
||||
* the docs/CREDITS.txt file.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace phpbb\di\extension;
|
||||
|
||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
|
||||
|
||||
/**
|
||||
* Container config extension
|
||||
*/
|
||||
class config extends Extension
|
||||
{
|
||||
/** @var array */
|
||||
protected $config_php;
|
||||
|
||||
public function __construct(\phpbb\config_php_file $config_php)
|
||||
{
|
||||
$this->config_php = $config_php;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a specific configuration.
|
||||
*
|
||||
* @param array $config An array of configuration values
|
||||
* @param ContainerBuilder $container A ContainerBuilder instance
|
||||
*
|
||||
* @throws \InvalidArgumentException When provided tag is not defined in this extension
|
||||
*/
|
||||
public function load(array $config, ContainerBuilder $container)
|
||||
{
|
||||
$parameters = array(
|
||||
'core.adm_relative_path' => $this->config_php->get('phpbb_adm_relative_path') ? $this->config_php->get('phpbb_adm_relative_path') : 'adm/',
|
||||
'core.table_prefix' => $this->config_php->get('table_prefix'),
|
||||
'cache.driver.class' => $this->convert_30_acm_type($this->config_php->get('acm_type')),
|
||||
'dbal.new_link' => defined('PHPBB_DB_NEW_LINK') && PHPBB_DB_NEW_LINK,
|
||||
);
|
||||
$parameter_bag = $container->getParameterBag();
|
||||
|
||||
foreach ($parameters as $parameter => $value)
|
||||
{
|
||||
$container->setParameter($parameter, $parameter_bag->escapeValue($value));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the recommended alias to use in XML.
|
||||
*
|
||||
* This alias is also the mandatory prefix to use when using YAML.
|
||||
*
|
||||
* @return string The alias
|
||||
*/
|
||||
public function getAlias()
|
||||
{
|
||||
return 'config';
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert 3.0 ACM type to 3.1 cache driver class name
|
||||
*
|
||||
* @param string $acm_type ACM type
|
||||
* @return string cache driver class
|
||||
*/
|
||||
protected function convert_30_acm_type($acm_type)
|
||||
{
|
||||
if (preg_match('#^[a-z]+$#', $acm_type))
|
||||
{
|
||||
return 'phpbb\\cache\\driver\\' . $acm_type;
|
||||
}
|
||||
|
||||
return $acm_type;
|
||||
}
|
||||
}
|
52
msd2/phpBB3/phpbb/di/extension/container_configuration.php
Normal file
52
msd2/phpBB3/phpbb/di/extension/container_configuration.php
Normal file
@ -0,0 +1,52 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* This file is part of the phpBB Forum Software package.
|
||||
*
|
||||
* @copyright (c) phpBB Limited <https://www.phpbb.com>
|
||||
* @license GNU General Public License, version 2 (GPL-2.0)
|
||||
*
|
||||
* For full copyright and license information, please see
|
||||
* the docs/CREDITS.txt file.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace phpbb\di\extension;
|
||||
|
||||
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
|
||||
use Symfony\Component\Config\Definition\ConfigurationInterface;
|
||||
|
||||
class container_configuration implements ConfigurationInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* Generates the configuration tree builder.
|
||||
*
|
||||
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
|
||||
*/
|
||||
public function getConfigTreeBuilder()
|
||||
{
|
||||
$treeBuilder = new TreeBuilder();
|
||||
$rootNode = $treeBuilder->root('core');
|
||||
$rootNode
|
||||
->children()
|
||||
->booleanNode('require_dev_dependencies')->defaultValue(false)->end()
|
||||
->arrayNode('debug')
|
||||
->addDefaultsIfNotSet()
|
||||
->children()
|
||||
->booleanNode('exceptions')->defaultValue(false)->end()
|
||||
->end()
|
||||
->end()
|
||||
->arrayNode('twig')
|
||||
->addDefaultsIfNotSet()
|
||||
->children()
|
||||
->booleanNode('debug')->defaultValue(null)->end()
|
||||
->booleanNode('auto_reload')->defaultValue(null)->end()
|
||||
->booleanNode('enable_debug_extension')->defaultValue(false)->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
;
|
||||
return $treeBuilder;
|
||||
}
|
||||
}
|
124
msd2/phpBB3/phpbb/di/extension/core.php
Normal file
124
msd2/phpBB3/phpbb/di/extension/core.php
Normal file
@ -0,0 +1,124 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* This file is part of the phpBB Forum Software package.
|
||||
*
|
||||
* @copyright (c) phpBB Limited <https://www.phpbb.com>
|
||||
* @license GNU General Public License, version 2 (GPL-2.0)
|
||||
*
|
||||
* For full copyright and license information, please see
|
||||
* the docs/CREDITS.txt file.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace phpbb\di\extension;
|
||||
|
||||
use Symfony\Component\Config\FileLocator;
|
||||
use Symfony\Component\Config\Resource\FileResource;
|
||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
|
||||
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
|
||||
|
||||
/**
|
||||
* Container core extension
|
||||
*/
|
||||
class core extends Extension
|
||||
{
|
||||
const TWIG_OPTIONS_POSITION = 7;
|
||||
|
||||
/**
|
||||
* Config path
|
||||
* @var string
|
||||
*/
|
||||
protected $config_path;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $config_path Config path
|
||||
*/
|
||||
public function __construct($config_path)
|
||||
{
|
||||
$this->config_path = $config_path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a specific configuration.
|
||||
*
|
||||
* @param array $configs An array of configuration values
|
||||
* @param ContainerBuilder $container A ContainerBuilder instance
|
||||
*
|
||||
* @throws \InvalidArgumentException When provided tag is not defined in this extension
|
||||
*/
|
||||
public function load(array $configs, ContainerBuilder $container)
|
||||
{
|
||||
$filesystem = new \phpbb\filesystem\filesystem();
|
||||
$loader = new YamlFileLoader($container, new FileLocator($filesystem->realpath($this->config_path)));
|
||||
$loader->load($container->getParameter('core.environment') . '/container/environment.yml');
|
||||
|
||||
$config = $this->getConfiguration($configs, $container);
|
||||
$config = $this->processConfiguration($config, $configs);
|
||||
|
||||
if ($config['require_dev_dependencies'])
|
||||
{
|
||||
if (!class_exists('Goutte\Client', true))
|
||||
{
|
||||
trigger_error(
|
||||
'Composer development dependencies have not been set up for the ' . $container->getParameter('core.environment') . ' environment yet, run ' .
|
||||
"'php ../composer.phar install --dev' from the phpBB directory to do so.",
|
||||
E_USER_ERROR
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Set the Twig options if defined in the environment
|
||||
$definition = $container->getDefinition('template.twig.environment');
|
||||
$twig_environment_options = $definition->getArgument(static::TWIG_OPTIONS_POSITION);
|
||||
if ($config['twig']['debug'])
|
||||
{
|
||||
$twig_environment_options['debug'] = true;
|
||||
}
|
||||
if ($config['twig']['auto_reload'])
|
||||
{
|
||||
$twig_environment_options['auto_reload'] = true;
|
||||
}
|
||||
|
||||
// Replace the 7th argument, the options passed to the environment
|
||||
$definition->replaceArgument(static::TWIG_OPTIONS_POSITION, $twig_environment_options);
|
||||
|
||||
if ($config['twig']['enable_debug_extension'])
|
||||
{
|
||||
$definition = $container->getDefinition('template.twig.extensions.debug');
|
||||
$definition->addTag('twig.extension');
|
||||
}
|
||||
|
||||
// Set the debug options
|
||||
foreach ($config['debug'] as $name => $value)
|
||||
{
|
||||
$container->setParameter('debug.' . $name, $value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getConfiguration(array $config, ContainerBuilder $container)
|
||||
{
|
||||
$r = new \ReflectionClass('\phpbb\di\extension\container_configuration');
|
||||
$container->addResource(new FileResource($r->getFileName()));
|
||||
|
||||
return new container_configuration();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the recommended alias to use in XML.
|
||||
*
|
||||
* This alias is also the mandatory prefix to use when using YAML.
|
||||
*
|
||||
* @return string The alias
|
||||
*/
|
||||
public function getAlias()
|
||||
{
|
||||
return 'core';
|
||||
}
|
||||
}
|
117
msd2/phpBB3/phpbb/di/ordered_service_collection.php
Normal file
117
msd2/phpBB3/phpbb/di/ordered_service_collection.php
Normal file
@ -0,0 +1,117 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* This file is part of the phpBB Forum Software package.
|
||||
*
|
||||
* @copyright (c) phpBB Limited <https://www.phpbb.com>
|
||||
* @license GNU General Public License, version 2 (GPL-2.0)
|
||||
*
|
||||
* For full copyright and license information, please see
|
||||
* the docs/CREDITS.txt file.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace phpbb\di;
|
||||
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
/**
|
||||
* Collection of services in a specified order
|
||||
*/
|
||||
class ordered_service_collection extends service_collection
|
||||
{
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
protected $is_ordered;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $service_ids;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param ContainerInterface $container Container object
|
||||
*/
|
||||
public function __construct(ContainerInterface $container)
|
||||
{
|
||||
$this->is_ordered = false;
|
||||
$this->service_ids = array();
|
||||
|
||||
parent::__construct($container);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getIterator()
|
||||
{
|
||||
if (!$this->is_ordered)
|
||||
{
|
||||
$this->sort_services();
|
||||
}
|
||||
|
||||
return new service_collection_iterator($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function offsetExists($index)
|
||||
{
|
||||
if (!$this->is_ordered)
|
||||
{
|
||||
$this->sort_services();
|
||||
}
|
||||
|
||||
return parent::offsetExists($index);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function offsetGet($index)
|
||||
{
|
||||
if (!$this->is_ordered)
|
||||
{
|
||||
$this->sort_services();
|
||||
}
|
||||
|
||||
return parent::offsetGet($index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a service ID to the collection
|
||||
*
|
||||
* @param string $service_id
|
||||
* @param int $order
|
||||
*/
|
||||
public function add($service_id, $order = 0)
|
||||
{
|
||||
$order = (int) $order;
|
||||
$this->service_ids[$order][] = $service_id;
|
||||
$this->is_ordered = false;
|
||||
}
|
||||
|
||||
protected function sort_services()
|
||||
{
|
||||
if ($this->is_ordered)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$this->exchangeArray(array());
|
||||
ksort($this->service_ids);
|
||||
foreach ($this->service_ids as $service_order_group)
|
||||
{
|
||||
foreach ($service_order_group as $service_id)
|
||||
{
|
||||
$this->offsetSet($service_id, null);
|
||||
}
|
||||
}
|
||||
|
||||
$this->is_ordered = true;
|
||||
}
|
||||
}
|
64
msd2/phpBB3/phpbb/di/pass/collection_pass.php
Normal file
64
msd2/phpBB3/phpbb/di/pass/collection_pass.php
Normal file
@ -0,0 +1,64 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* This file is part of the phpBB Forum Software package.
|
||||
*
|
||||
* @copyright (c) phpBB Limited <https://www.phpbb.com>
|
||||
* @license GNU General Public License, version 2 (GPL-2.0)
|
||||
*
|
||||
* For full copyright and license information, please see
|
||||
* the docs/CREDITS.txt file.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace phpbb\di\pass;
|
||||
|
||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
|
||||
|
||||
/**
|
||||
* Appends an add method call to the definition of each collection service for
|
||||
* the services tagged with the appropriate name defined in the collection's
|
||||
* service_collection tag.
|
||||
*/
|
||||
class collection_pass implements CompilerPassInterface
|
||||
{
|
||||
/**
|
||||
* Modify the container before it is passed to the rest of the code
|
||||
*
|
||||
* @param ContainerBuilder $container ContainerBuilder object
|
||||
* @return null
|
||||
*/
|
||||
public function process(ContainerBuilder $container)
|
||||
{
|
||||
foreach ($container->findTaggedServiceIds('service_collection') as $id => $data)
|
||||
{
|
||||
$definition = $container->getDefinition($id);
|
||||
$is_ordered_collection = (substr($definition->getClass(), -strlen('ordered_service_collection')) === 'ordered_service_collection');
|
||||
$is_class_name_aware = (isset($data[0]['class_name_aware']) && $data[0]['class_name_aware']);
|
||||
|
||||
foreach ($container->findTaggedServiceIds($data[0]['tag']) as $service_id => $service_data)
|
||||
{
|
||||
if ($is_ordered_collection)
|
||||
{
|
||||
$arguments = array($service_id, $service_data[0]['order']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$arguments = array($service_id);
|
||||
}
|
||||
|
||||
if ($is_class_name_aware)
|
||||
{
|
||||
$service_definition = $container->getDefinition($service_id);
|
||||
$definition->addMethodCall('add_service_class', array(
|
||||
$service_id,
|
||||
$service_definition->getClass()
|
||||
));
|
||||
}
|
||||
|
||||
$definition->addMethodCall('add', $arguments);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
72
msd2/phpBB3/phpbb/di/proxy_instantiator.php
Normal file
72
msd2/phpBB3/phpbb/di/proxy_instantiator.php
Normal file
@ -0,0 +1,72 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* This file is part of the phpBB Forum Software package.
|
||||
*
|
||||
* @copyright (c) phpBB Limited <https://www.phpbb.com>
|
||||
* @license GNU General Public License, version 2 (GPL-2.0)
|
||||
*
|
||||
* For full copyright and license information, please see
|
||||
* the docs/CREDITS.txt file.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace phpbb\di;
|
||||
|
||||
use ProxyManager\Configuration;
|
||||
use ProxyManager\Factory\LazyLoadingValueHolderFactory;
|
||||
use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
use Symfony\Component\DependencyInjection\Definition;
|
||||
use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\InstantiatorInterface;
|
||||
|
||||
/**
|
||||
* Runtime lazy loading proxy generator extended for allowing use while using
|
||||
* open_basedir restrictions
|
||||
*
|
||||
* Original author: Marco Pivetta <ocramius@gmail.com>
|
||||
*/
|
||||
class proxy_instantiator implements InstantiatorInterface
|
||||
{
|
||||
/**
|
||||
* @var LazyLoadingValueHolderFactory
|
||||
*/
|
||||
private $factory;
|
||||
|
||||
/**
|
||||
* proxy_instantiator constructor
|
||||
* @param string $cache_dir Cache dir for fall back when using open_basedir
|
||||
*/
|
||||
public function __construct($cache_dir)
|
||||
{
|
||||
$config = new Configuration();
|
||||
|
||||
// Prevent trying to write to system temp dir in case of open_basedir
|
||||
// restrictions being in effect
|
||||
$tmp_dir = (function_exists('sys_get_temp_dir')) ? sys_get_temp_dir() : '';
|
||||
if (empty($tmp_dir) || !@file_exists($tmp_dir) || !@is_writable($tmp_dir))
|
||||
{
|
||||
$config->setProxiesTargetDir($cache_dir);
|
||||
}
|
||||
$config->setGeneratorStrategy(new EvaluatingGeneratorStrategy());
|
||||
|
||||
$this->factory = new LazyLoadingValueHolderFactory($config);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function instantiateProxy(ContainerInterface $container, Definition $definition, $id, $realInstantiator)
|
||||
{
|
||||
return $this->factory->createProxy(
|
||||
$definition->getClass(),
|
||||
function (&$wrappedInstance, \ProxyManager\Proxy\LazyLoadingInterface $proxy) use ($realInstantiator) {
|
||||
$wrappedInstance = call_user_func($realInstantiator);
|
||||
|
||||
$proxy->setProxyInitializer(null);
|
||||
|
||||
return true;
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
106
msd2/phpBB3/phpbb/di/service_collection.php
Normal file
106
msd2/phpBB3/phpbb/di/service_collection.php
Normal file
@ -0,0 +1,106 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* This file is part of the phpBB Forum Software package.
|
||||
*
|
||||
* @copyright (c) phpBB Limited <https://www.phpbb.com>
|
||||
* @license GNU General Public License, version 2 (GPL-2.0)
|
||||
*
|
||||
* For full copyright and license information, please see
|
||||
* the docs/CREDITS.txt file.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace phpbb\di;
|
||||
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
/**
|
||||
* Collection of services to be configured at container compile time.
|
||||
*/
|
||||
class service_collection extends \ArrayObject
|
||||
{
|
||||
/**
|
||||
* @var \Symfony\Component\DependencyInjection\ContainerInterface
|
||||
*/
|
||||
protected $container;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $service_classes;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param ContainerInterface $container Container object
|
||||
*/
|
||||
public function __construct(ContainerInterface $container)
|
||||
{
|
||||
$this->container = $container;
|
||||
$this->service_classes = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getIterator()
|
||||
{
|
||||
return new service_collection_iterator($this);
|
||||
}
|
||||
|
||||
// Because of a PHP issue we have to redefine offsetExists
|
||||
// (even with a call to the parent):
|
||||
// https://bugs.php.net/bug.php?id=66834
|
||||
// https://bugs.php.net/bug.php?id=67067
|
||||
// But it triggers a sniffer issue that we have to skip
|
||||
// @codingStandardsIgnoreStart
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function offsetExists($index)
|
||||
{
|
||||
return parent::offsetExists($index);
|
||||
}
|
||||
// @codingStandardsIgnoreEnd
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function offsetGet($index)
|
||||
{
|
||||
return $this->container->get($index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a service to the collection
|
||||
*
|
||||
* @param string $name The service name
|
||||
* @return null
|
||||
*/
|
||||
public function add($name)
|
||||
{
|
||||
$this->offsetSet($name, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a service's class to the collection
|
||||
*
|
||||
* @param string $service_id
|
||||
* @param string $class
|
||||
*/
|
||||
public function add_service_class($service_id, $class)
|
||||
{
|
||||
$this->service_classes[$service_id] = $class;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get services' classes
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function get_service_classes()
|
||||
{
|
||||
return $this->service_classes;
|
||||
}
|
||||
}
|
46
msd2/phpBB3/phpbb/di/service_collection_iterator.php
Normal file
46
msd2/phpBB3/phpbb/di/service_collection_iterator.php
Normal file
@ -0,0 +1,46 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* This file is part of the phpBB Forum Software package.
|
||||
*
|
||||
* @copyright (c) phpBB Limited <https://www.phpbb.com>
|
||||
* @license GNU General Public License, version 2 (GPL-2.0)
|
||||
*
|
||||
* For full copyright and license information, please see
|
||||
* the docs/CREDITS.txt file.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace phpbb\di;
|
||||
|
||||
/**
|
||||
* Iterator which loads the services when they are requested
|
||||
*/
|
||||
class service_collection_iterator extends \ArrayIterator
|
||||
{
|
||||
/**
|
||||
* @var \phpbb\di\service_collection
|
||||
*/
|
||||
protected $collection;
|
||||
|
||||
/**
|
||||
* Construct an ArrayIterator for service_collection
|
||||
*
|
||||
* @param \phpbb\di\service_collection $collection The collection to iterate over
|
||||
* @param int $flags Flags to control the behaviour of the ArrayObject object.
|
||||
* @see ArrayObject::setFlags()
|
||||
*/
|
||||
public function __construct(service_collection $collection, $flags = 0)
|
||||
{
|
||||
parent::__construct($collection->getArrayCopy(), $flags);
|
||||
$this->collection = $collection;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function current()
|
||||
{
|
||||
return $this->collection->offsetGet($this->key());
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user