mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-10 13:28:55 +00:00
[ticket/11700] Correctly load extensions with nonprefixed namespaces
PHPBB3-11700
This commit is contained in:
parent
d12f358855
commit
c4b53490ad
29 changed files with 111 additions and 72 deletions
|
@ -87,7 +87,7 @@ set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handle
|
|||
// Setup class loader first
|
||||
$phpbb_class_loader = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}phpbb/", $phpEx);
|
||||
$phpbb_class_loader->register();
|
||||
$phpbb_class_loader_ext = new \phpbb\class_loader('phpbb_ext_', "{$phpbb_root_path}ext/", $phpEx);
|
||||
$phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/", $phpEx);
|
||||
$phpbb_class_loader_ext->register();
|
||||
|
||||
// Set up container
|
||||
|
|
|
@ -52,7 +52,7 @@ services:
|
|||
class_loader.ext:
|
||||
class: phpbb\class_loader
|
||||
arguments:
|
||||
- phpbb\ext\
|
||||
- \
|
||||
- %core.root_path%ext/
|
||||
- %core.php_ext%
|
||||
calls:
|
||||
|
|
|
@ -50,9 +50,9 @@ if (isset($_GET['avatar']))
|
|||
require($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx);
|
||||
|
||||
// Setup class loader first
|
||||
$phpbb_class_loader = new \phpbb\class_loader('phpbb_', "{$phpbb_root_path}phpbb/", $phpEx);
|
||||
$phpbb_class_loader = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}phpbb/", $phpEx);
|
||||
$phpbb_class_loader->register();
|
||||
$phpbb_class_loader_ext = new \phpbb\class_loader('phpbb_ext_', "{$phpbb_root_path}ext/", $phpEx);
|
||||
$phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/", $phpEx);
|
||||
$phpbb_class_loader_ext->register();
|
||||
|
||||
// Set up container
|
||||
|
|
|
@ -565,7 +565,7 @@ class acp_modules
|
|||
{
|
||||
// Skip entries we do not need if we know the module we are
|
||||
// looking for
|
||||
if ($module && strpos($cur_module, $module) === false)
|
||||
if ($module && strpos(str_replace('\\', '_', $cur_module), $module) === false)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -112,7 +112,7 @@ $phpbb_class_loader_new = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}
|
|||
$phpbb_class_loader_new->register();
|
||||
$phpbb_class_loader = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}phpbb/", $phpEx);
|
||||
$phpbb_class_loader->register();
|
||||
$phpbb_class_loader_ext = new \phpbb\class_loader('phpbb\\ext\\', "{$phpbb_root_path}ext/", $phpEx);
|
||||
$phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/", $phpEx);
|
||||
$phpbb_class_loader_ext->register();
|
||||
|
||||
// Set up container
|
||||
|
|
|
@ -277,15 +277,16 @@ class finder
|
|||
$classes = array();
|
||||
foreach ($files as $file => $ext_name)
|
||||
{
|
||||
if (preg_match('#^includes/#', $file))
|
||||
$class = substr($file, 0, -strlen('.' . $this->php_ext));
|
||||
if ($ext_name === '/' && preg_match('#^includes/#', $file))
|
||||
{
|
||||
$file = preg_replace('#^includes/#', '', $file);
|
||||
$classes[] = 'phpbb_' . str_replace('/', '_', substr($file, 0, -strlen('.' . $this->php_ext)));
|
||||
$class = preg_replace('#^includes/#', '', $class);
|
||||
$classes[] = 'phpbb_' . str_replace('/', '_', $class);
|
||||
}
|
||||
else
|
||||
{
|
||||
$file = preg_replace('#^phpbb/#', '', $file);
|
||||
$classes[] = 'phpbb\\' . str_replace('/', '\\', substr($file, 0, -strlen('.' . $this->php_ext)));
|
||||
$class = preg_replace('#^ext/#', '', $class);
|
||||
$classes[] = str_replace('/', '\\', $class);
|
||||
}
|
||||
}
|
||||
return $classes;
|
||||
|
|
|
@ -133,7 +133,7 @@ class manager
|
|||
*/
|
||||
public function get_extension($name)
|
||||
{
|
||||
$extension_class_name = 'phpbb_ext_' . str_replace('/', '_', $name) . '_ext';
|
||||
$extension_class_name = str_replace('/', '\\', $name) . '\\ext';
|
||||
|
||||
$migrator = $this->container->get('migrator');
|
||||
|
||||
|
|
|
@ -60,13 +60,13 @@ class phpbb_class_loader_test extends PHPUnit_Framework_TestCase
|
|||
{
|
||||
$cache_map = array(
|
||||
'class_loader_phpbb__' => array('phpbb\\a\\cached_name' => 'a/cached_name'),
|
||||
'class_loader_phpbb__ext__' => array('phpbb\\ext\\foo' => 'foo'),
|
||||
'class_loader___' => array('phpbb\\ext\\foo' => 'foo'),
|
||||
);
|
||||
$cache = new phpbb_mock_cache($cache_map);
|
||||
|
||||
$prefix = dirname(__FILE__) . '/';
|
||||
$class_loader = new \phpbb\class_loader('phpbb\\', $prefix . 'phpbb/', 'php', $cache);
|
||||
$class_loader_ext = new \phpbb\class_loader('phpbb\\ext\\', $prefix . 'phpbb/', 'php', $cache);
|
||||
$class_loader_ext = new \phpbb\class_loader('\\', $prefix . 'phpbb/', 'php', $cache);
|
||||
|
||||
$prefix .= 'phpbb/';
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_bar_ext extends \phpbb\extension\base
|
||||
namespace bar;
|
||||
|
||||
class ext extends \phpbb\extension\base
|
||||
{
|
||||
static public $state;
|
||||
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_barfoo_acp_a_info
|
||||
namespace barfoo\acp;
|
||||
|
||||
class a_info
|
||||
{
|
||||
public function module()
|
||||
{
|
||||
return array(
|
||||
'filename' => 'phpbb_ext_barfoo_acp_a_module',
|
||||
'filename' => 'barfoo\\acp\\a_module',
|
||||
'title' => 'Barfoo',
|
||||
'version' => '3.1.0-dev',
|
||||
'modes' => array(
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_barfoo_acp_a_module
|
||||
namespace barfoo\acp;
|
||||
|
||||
class a_module
|
||||
{
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_barfoo_ext extends \phpbb\extension\base
|
||||
namespace barfoo;
|
||||
|
||||
class ext extends \phpbb\extension\base
|
||||
{
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_foo_a_class
|
||||
namespace foo;
|
||||
|
||||
class a_class
|
||||
{
|
||||
}
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_foo_acp_a_info
|
||||
namespace foo\acp;
|
||||
|
||||
class a_info
|
||||
{
|
||||
public function module()
|
||||
{
|
||||
return array(
|
||||
'filename' => 'phpbb_ext_foo_acp_a_module',
|
||||
'filename' => 'foo\\acp\\a_module',
|
||||
'title' => 'Foobar',
|
||||
'version' => '3.1.0-dev',
|
||||
'modes' => array(
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_foo_acp_a_module
|
||||
namespace foo\acp;
|
||||
|
||||
class a_module
|
||||
{
|
||||
}
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
<?php
|
||||
|
||||
namespace foo\acp;
|
||||
|
||||
/*
|
||||
* Due to the mismatch between the class name and the file name, this module
|
||||
* file shouldn't be found by the extension finder
|
||||
*/
|
||||
class phpbb_ext_foo_acp_foo_info
|
||||
class foo_info
|
||||
{
|
||||
public function module()
|
||||
{
|
||||
|
|
|
@ -1,8 +1,11 @@
|
|||
<?php
|
||||
|
||||
namespace foo\acp;
|
||||
|
||||
/*
|
||||
* Due to the mismatch between the class name and the file name of the module
|
||||
* info file, this module's info file shouldn't be found
|
||||
*/
|
||||
class phpbb_ext_foo_acp_fail_module
|
||||
class fail_module
|
||||
{
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_foo_b_class
|
||||
namespace foo;
|
||||
|
||||
class b_class
|
||||
{
|
||||
}
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_foo_ext extends \phpbb\extension\base
|
||||
namespace foo;
|
||||
|
||||
class ext extends \phpbb\extension\base
|
||||
{
|
||||
static public $disabled;
|
||||
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_foo_mcp_a_info
|
||||
namespace foo\mcp;
|
||||
|
||||
class a_info
|
||||
{
|
||||
public function module()
|
||||
{
|
||||
return array(
|
||||
'filename' => 'phpbb_ext_foo_mcp_a_module',
|
||||
'filename' => 'foo\\mcp\\a_module',
|
||||
'title' => 'Foobar',
|
||||
'version' => '3.1.0-dev',
|
||||
'modes' => array(
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_foo_mcp_a_module
|
||||
namespace foo\mcp;
|
||||
|
||||
class a_module
|
||||
{
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_foo_sub_type_alternative
|
||||
namespace foo\sub\type;
|
||||
|
||||
class alternative
|
||||
{
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_foo_type_alternative
|
||||
namespace foo\type;
|
||||
|
||||
class alternative
|
||||
{
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_foo_typewrong_error
|
||||
namespace foo\typewrong;
|
||||
|
||||
class error
|
||||
{
|
||||
}
|
||||
|
|
4
tests/extension/ext/vendor/moo/ext.php
vendored
4
tests/extension/ext/vendor/moo/ext.php
vendored
|
@ -1,6 +1,8 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_vendor_moo_ext extends \phpbb\extension\base
|
||||
namespace vendor\moo;
|
||||
|
||||
class ext extends \phpbb\extension\base
|
||||
{
|
||||
static public $purged;
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
|
||||
class phpbb_ext_vendor_moo_feature_class
|
||||
namespace vendor\moo;
|
||||
|
||||
class feature_class
|
||||
{
|
||||
}
|
||||
|
|
|
@ -43,10 +43,10 @@ class phpbb_extension_finder_test extends phpbb_test_case
|
|||
sort($classes);
|
||||
$this->assertEquals(
|
||||
array(
|
||||
'bar\my\hidden_class',
|
||||
'foo\a_class',
|
||||
'foo\b_class',
|
||||
'phpbb\default\implementation',
|
||||
'phpbb\ext\bar\my\hidden_class',
|
||||
'phpbb\ext\foo\a_class',
|
||||
'phpbb\ext\foo\b_class',
|
||||
),
|
||||
$classes
|
||||
);
|
||||
|
@ -88,8 +88,8 @@ class phpbb_extension_finder_test extends phpbb_test_case
|
|||
sort($classes);
|
||||
$this->assertEquals(
|
||||
array(
|
||||
'bar\my\hidden_class',
|
||||
'phpbb\default\implementation',
|
||||
'phpbb\ext\bar\my\hidden_class',
|
||||
),
|
||||
$classes
|
||||
);
|
||||
|
@ -105,9 +105,9 @@ class phpbb_extension_finder_test extends phpbb_test_case
|
|||
sort($classes);
|
||||
$this->assertEquals(
|
||||
array(
|
||||
'foo\sub\type\alternative',
|
||||
'foo\type\alternative',
|
||||
'phpbb\default\implementation',
|
||||
'phpbb\ext\foo\sub\type\alternative',
|
||||
'phpbb\ext\foo\type\alternative',
|
||||
),
|
||||
$classes
|
||||
);
|
||||
|
@ -122,7 +122,7 @@ class phpbb_extension_finder_test extends phpbb_test_case
|
|||
sort($classes);
|
||||
$this->assertEquals(
|
||||
array(
|
||||
'phpbb\ext\foo\type\alternative',
|
||||
'foo\type\alternative',
|
||||
),
|
||||
$classes
|
||||
);
|
||||
|
@ -137,7 +137,7 @@ class phpbb_extension_finder_test extends phpbb_test_case
|
|||
sort($classes);
|
||||
$this->assertEquals(
|
||||
array(
|
||||
'phpbb\ext\foo\sub\type\alternative',
|
||||
'foo\sub\type\alternative',
|
||||
),
|
||||
$classes
|
||||
);
|
||||
|
@ -152,7 +152,7 @@ class phpbb_extension_finder_test extends phpbb_test_case
|
|||
sort($classes);
|
||||
$this->assertEquals(
|
||||
array(
|
||||
'phpbb\ext\foo\sub\type\alternative',
|
||||
'foo\sub\type\alternative',
|
||||
),
|
||||
$classes
|
||||
);
|
||||
|
@ -168,8 +168,8 @@ class phpbb_extension_finder_test extends phpbb_test_case
|
|||
sort($classes);
|
||||
$this->assertEquals(
|
||||
array(
|
||||
'phpbb\ext\foo\type\alternative',
|
||||
'phpbb\ext\foo\type\dummy\empty',
|
||||
'foo\type\alternative',
|
||||
'foo\type\dummy\empty',
|
||||
),
|
||||
$classes
|
||||
);
|
||||
|
|
|
@ -45,31 +45,31 @@ class phpbb_extension_manager_test extends phpbb_database_test_case
|
|||
|
||||
public function test_enable()
|
||||
{
|
||||
phpbb_ext_bar_ext::$state = 0;
|
||||
bar\ext::$state = 0;
|
||||
|
||||
$this->assertEquals(array('foo'), array_keys($this->extension_manager->all_enabled()));
|
||||
$this->extension_manager->enable('bar');
|
||||
$this->assertEquals(array('bar', 'foo'), array_keys($this->extension_manager->all_enabled()));
|
||||
$this->assertEquals(array('bar', 'foo', 'vendor/moo'), array_keys($this->extension_manager->all_configured()));
|
||||
|
||||
$this->assertEquals(4, phpbb_ext_bar_ext::$state);
|
||||
$this->assertEquals(4, bar\ext::$state);
|
||||
}
|
||||
|
||||
public function test_disable()
|
||||
{
|
||||
phpbb_ext_foo_ext::$disabled = false;
|
||||
foo\ext::$disabled = false;
|
||||
|
||||
$this->assertEquals(array('foo'), array_keys($this->extension_manager->all_enabled()));
|
||||
$this->extension_manager->disable('foo');
|
||||
$this->assertEquals(array(), array_keys($this->extension_manager->all_enabled()));
|
||||
$this->assertEquals(array('foo', 'vendor/moo'), array_keys($this->extension_manager->all_configured()));
|
||||
|
||||
$this->assertTrue(phpbb_ext_foo_ext::$disabled);
|
||||
$this->assertTrue(foo\ext::$disabled);
|
||||
}
|
||||
|
||||
public function test_purge()
|
||||
{
|
||||
phpbb_ext_vendor_moo_ext::$purged = false;
|
||||
vendor\moo\ext::$purged = false;
|
||||
|
||||
$this->assertEquals(array('foo'), array_keys($this->extension_manager->all_enabled()));
|
||||
$this->assertEquals(array('foo', 'vendor/moo'), array_keys($this->extension_manager->all_configured()));
|
||||
|
@ -77,7 +77,7 @@ class phpbb_extension_manager_test extends phpbb_database_test_case
|
|||
$this->assertEquals(array('foo'), array_keys($this->extension_manager->all_enabled()));
|
||||
$this->assertEquals(array('foo'), array_keys($this->extension_manager->all_configured()));
|
||||
|
||||
$this->assertTrue(phpbb_ext_vendor_moo_ext::$purged);
|
||||
$this->assertTrue(vendor\moo\ext::$purged);
|
||||
}
|
||||
|
||||
public function test_enabled_no_cache()
|
||||
|
|
|
@ -45,7 +45,7 @@ class phpbb_extension_modules_test extends phpbb_test_case
|
|||
{
|
||||
global $phpbb_root_path;
|
||||
|
||||
$this->markTestIncomplete('Modules no speak namespace! Going to get rid of db modules altogether and fix this test after.');
|
||||
// $this->markTestIncomplete('Modules no speak namespace! Going to get rid of db modules altogether and fix this test after.');
|
||||
|
||||
// Correctly set the root path for this test to this directory, so the classes can be found
|
||||
$phpbb_root_path = dirname(__FILE__) . '/';
|
||||
|
@ -54,8 +54,8 @@ class phpbb_extension_modules_test extends phpbb_test_case
|
|||
$this->acp_modules->module_class = 'acp';
|
||||
$acp_modules = $this->acp_modules->get_module_infos();
|
||||
$this->assertEquals(array(
|
||||
'phpbb_ext_foo_acp_a_module' => array(
|
||||
'filename' => 'phpbb_ext_foo_acp_a_module',
|
||||
'foo\\acp\\a_module' => array(
|
||||
'filename' => 'foo\\acp\\a_module',
|
||||
'title' => 'Foobar',
|
||||
'version' => '3.1.0-dev',
|
||||
'modes' => array(
|
||||
|
@ -76,8 +76,8 @@ class phpbb_extension_modules_test extends phpbb_test_case
|
|||
$this->acp_modules->module_class = 'mcp';
|
||||
$acp_modules = $this->acp_modules->get_module_infos();
|
||||
$this->assertEquals(array(
|
||||
'phpbb_ext_foo_mcp_a_module' => array(
|
||||
'filename' => 'phpbb_ext_foo_mcp_a_module',
|
||||
'foo\\mcp\\a_module' => array(
|
||||
'filename' => 'foo\\mcp\\a_module',
|
||||
'title' => 'Foobar',
|
||||
'version' => '3.1.0-dev',
|
||||
'modes' => array(
|
||||
|
@ -90,8 +90,8 @@ class phpbb_extension_modules_test extends phpbb_test_case
|
|||
$this->acp_modules->module_class = 'mcp';
|
||||
$acp_modules = $this->acp_modules->get_module_infos('mcp_a_module');
|
||||
$this->assertEquals(array(
|
||||
'phpbb_ext_foo_mcp_a_module' => array(
|
||||
'filename' => 'phpbb_ext_foo_mcp_a_module',
|
||||
'foo\\mcp\\a_module' => array(
|
||||
'filename' => 'foo\\mcp\\a_module',
|
||||
'title' => 'Foobar',
|
||||
'version' => '3.1.0-dev',
|
||||
'modes' => array(
|
||||
|
@ -104,8 +104,8 @@ class phpbb_extension_modules_test extends phpbb_test_case
|
|||
$this->acp_modules->module_class = '';
|
||||
$acp_modules = $this->acp_modules->get_module_infos('mcp_a_module', 'mcp');
|
||||
$this->assertEquals(array(
|
||||
'phpbb_ext_foo_mcp_a_module' => array(
|
||||
'filename' => 'phpbb_ext_foo_mcp_a_module',
|
||||
'foo\\mcp\\a_module' => array(
|
||||
'filename' => 'foo\\mcp\\a_module',
|
||||
'title' => 'Foobar',
|
||||
'version' => '3.1.0-dev',
|
||||
'modes' => array(
|
||||
|
@ -126,10 +126,10 @@ class phpbb_extension_modules_test extends phpbb_test_case
|
|||
|
||||
// Get module info of specified extension module
|
||||
$this->acp_modules->module_class = 'acp';
|
||||
$acp_modules = $this->acp_modules->get_module_infos('phpbb_ext_foo_acp_a_module');
|
||||
$acp_modules = $this->acp_modules->get_module_infos('foo_acp_a_module');
|
||||
$this->assertEquals(array(
|
||||
'phpbb_ext_foo_acp_a_module' => array (
|
||||
'filename' => 'phpbb_ext_foo_acp_a_module',
|
||||
'foo\\acp\\a_module' => array (
|
||||
'filename' => 'foo\\acp\\a_module',
|
||||
'title' => 'Foobar',
|
||||
'version' => '3.1.0-dev',
|
||||
'modes' => array (
|
||||
|
@ -152,8 +152,8 @@ class phpbb_extension_modules_test extends phpbb_test_case
|
|||
$this->acp_modules->module_class = 'acp';
|
||||
$acp_modules = $this->acp_modules->get_module_infos('', false, true);
|
||||
$this->assertEquals(array(
|
||||
'phpbb_ext_foo_acp_a_module' => array(
|
||||
'filename' => 'phpbb_ext_foo_acp_a_module',
|
||||
'foo\\acp\\a_module' => array(
|
||||
'filename' => 'foo\\acp\\a_module',
|
||||
'title' => 'Foobar',
|
||||
'version' => '3.1.0-dev',
|
||||
'modes' => array(
|
||||
|
@ -168,8 +168,8 @@ class phpbb_extension_modules_test extends phpbb_test_case
|
|||
'test' => array('title' => 'Test', 'auth' => '', 'cat' => array('ACP_GENERAL')),
|
||||
),
|
||||
),
|
||||
'phpbb_ext_barfoo_acp_a_module' => array(
|
||||
'filename' => 'phpbb_ext_barfoo_acp_a_module',
|
||||
'barfoo\\acp\\a_module' => array(
|
||||
'filename' => 'barfoo\\acp\\a_module',
|
||||
'title' => 'Barfoo',
|
||||
'version' => '3.1.0-dev',
|
||||
'modes' => array(
|
||||
|
@ -179,10 +179,10 @@ class phpbb_extension_modules_test extends phpbb_test_case
|
|||
), $acp_modules);
|
||||
|
||||
// Specific module set to disabled extension
|
||||
$acp_modules = $this->acp_modules->get_module_infos('phpbb_ext_barfoo_acp_a_module', 'acp', true);
|
||||
$acp_modules = $this->acp_modules->get_module_infos('barfoo_acp_a_module', 'acp', true);
|
||||
$this->assertEquals(array(
|
||||
'phpbb_ext_barfoo_acp_a_module' => array(
|
||||
'filename' => 'phpbb_ext_barfoo_acp_a_module',
|
||||
'barfoo\\acp\\a_module' => array(
|
||||
'filename' => 'barfoo\\acp\\a_module',
|
||||
'title' => 'Barfoo',
|
||||
'version' => '3.1.0-dev',
|
||||
'modes' => array(
|
||||
|
|
Loading…
Add table
Reference in a new issue