[ticket/11700] Correctly load extensions with nonprefixed namespaces

PHPBB3-11700
This commit is contained in:
Nils Adermann 2013-09-17 16:15:44 +02:00
parent d12f358855
commit c4b53490ad
29 changed files with 111 additions and 72 deletions

View file

@ -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

View file

@ -52,7 +52,7 @@ services:
class_loader.ext:
class: phpbb\class_loader
arguments:
- phpbb\ext\
- \
- %core.root_path%ext/
- %core.php_ext%
calls:

View file

@ -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

View file

@ -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;
}

View file

@ -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

View file

@ -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;

View file

@ -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');

View file

@ -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/';

View file

@ -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;

View file

@ -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(

View file

@ -1,5 +1,7 @@
<?php
class phpbb_ext_barfoo_acp_a_module
namespace barfoo\acp;
class a_module
{
}

View file

@ -1,5 +1,7 @@
<?php
class phpbb_ext_barfoo_ext extends \phpbb\extension\base
namespace barfoo;
class ext extends \phpbb\extension\base
{
}

View file

@ -1,5 +1,7 @@
<?php
class phpbb_ext_foo_a_class
namespace foo;
class a_class
{
}

View file

@ -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(

View file

@ -1,5 +1,7 @@
<?php
class phpbb_ext_foo_acp_a_module
namespace foo\acp;
class a_module
{
}

View file

@ -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()
{

View file

@ -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
{
}

View file

@ -1,5 +1,7 @@
<?php
class phpbb_ext_foo_b_class
namespace foo;
class b_class
{
}

View file

@ -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;

View file

@ -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(

View file

@ -1,5 +1,7 @@
<?php
class phpbb_ext_foo_mcp_a_module
namespace foo\mcp;
class a_module
{
}

View file

@ -1,5 +1,7 @@
<?php
class phpbb_ext_foo_sub_type_alternative
namespace foo\sub\type;
class alternative
{
}

View file

@ -1,5 +1,7 @@
<?php
class phpbb_ext_foo_type_alternative
namespace foo\type;
class alternative
{
}

View file

@ -1,5 +1,7 @@
<?php
class phpbb_ext_foo_typewrong_error
namespace foo\typewrong;
class error
{
}

View file

@ -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;

View file

@ -1,5 +1,7 @@
<?php
class phpbb_ext_vendor_moo_feature_class
namespace vendor\moo;
class feature_class
{
}

View file

@ -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
);

View file

@ -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()

View file

@ -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(