mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
Merge pull request #9408 from chrometoasters/pulls/classes-with-extension
Add ClassInfo method to get all classes with a given extension applied
This commit is contained in:
commit
f94078d963
@ -560,4 +560,40 @@ class ClassInfo
|
|||||||
static::$_cache_parse[$classSpec] = $result;
|
static::$_cache_parse[$classSpec] = $result;
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of classes with a particular extension applied
|
||||||
|
*
|
||||||
|
* This reflects all extensions added (or removed) both via the configuration API as well as dynamically
|
||||||
|
* using Extensible::add_extension() and Extensible::remove_extension().
|
||||||
|
*
|
||||||
|
* @param string $extensionClass Extension class name
|
||||||
|
* @param string $baseClassOrObject Class or object to find subclasses of with the extension applied
|
||||||
|
* @param bool $includeBaseClass Include the base class itself if it has the extension applied?
|
||||||
|
* @return string[] Class names with the extension applied
|
||||||
|
* @throws \ReflectionException
|
||||||
|
*/
|
||||||
|
public static function classesWithExtension(
|
||||||
|
string $extensionClass,
|
||||||
|
string $baseClassOrObject = DataObject::class,
|
||||||
|
bool $includeBaseClass = false
|
||||||
|
): array {
|
||||||
|
// get class names
|
||||||
|
$baseClass = self::class_name($baseClassOrObject);
|
||||||
|
|
||||||
|
// get a list of all subclasses for a given class
|
||||||
|
$classes = ClassInfo::subclassesFor($baseClass, $includeBaseClass);
|
||||||
|
|
||||||
|
// include the base class if required
|
||||||
|
if ($includeBaseClass) {
|
||||||
|
$classes = array_merge([strtolower($baseClass) => $baseClass], $classes);
|
||||||
|
}
|
||||||
|
|
||||||
|
// only keep classes with the Extension applied
|
||||||
|
$classes = array_filter($classes, function ($class) use ($extensionClass) {
|
||||||
|
return Extensible::has_extension($class, $extensionClass);
|
||||||
|
});
|
||||||
|
|
||||||
|
return $classes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,13 @@ use ReflectionException;
|
|||||||
use SilverStripe\Core\ClassInfo;
|
use SilverStripe\Core\ClassInfo;
|
||||||
use SilverStripe\Core\Tests\ClassInfoTest\BaseClass;
|
use SilverStripe\Core\Tests\ClassInfoTest\BaseClass;
|
||||||
use SilverStripe\Core\Tests\ClassInfoTest\BaseDataClass;
|
use SilverStripe\Core\Tests\ClassInfoTest\BaseDataClass;
|
||||||
|
use SilverStripe\Core\Tests\ClassInfoTest\BaseObject;
|
||||||
use SilverStripe\Core\Tests\ClassInfoTest\ChildClass;
|
use SilverStripe\Core\Tests\ClassInfoTest\ChildClass;
|
||||||
|
use SilverStripe\Core\Tests\ClassInfoTest\ExtendTest;
|
||||||
|
use SilverStripe\Core\Tests\ClassInfoTest\ExtendTest2;
|
||||||
|
use SilverStripe\Core\Tests\ClassInfoTest\ExtendTest3;
|
||||||
|
use SilverStripe\Core\Tests\ClassInfoTest\ExtensionTest1;
|
||||||
|
use SilverStripe\Core\Tests\ClassInfoTest\ExtensionTest2;
|
||||||
use SilverStripe\Core\Tests\ClassInfoTest\GrandChildClass;
|
use SilverStripe\Core\Tests\ClassInfoTest\GrandChildClass;
|
||||||
use SilverStripe\Core\Tests\ClassInfoTest\HasFields;
|
use SilverStripe\Core\Tests\ClassInfoTest\HasFields;
|
||||||
use SilverStripe\Core\Tests\ClassInfoTest\NoFields;
|
use SilverStripe\Core\Tests\ClassInfoTest\NoFields;
|
||||||
@ -28,6 +34,10 @@ class ClassInfoTest extends SapphireTest
|
|||||||
NoFields::class,
|
NoFields::class,
|
||||||
WithCustomTable::class,
|
WithCustomTable::class,
|
||||||
WithRelation::class,
|
WithRelation::class,
|
||||||
|
BaseObject::class,
|
||||||
|
ExtendTest::class,
|
||||||
|
ExtendTest2::class,
|
||||||
|
ExtendTest3::class,
|
||||||
);
|
);
|
||||||
|
|
||||||
protected function setUp()
|
protected function setUp()
|
||||||
@ -189,4 +199,70 @@ class ClassInfoTest extends SapphireTest
|
|||||||
ClassInfo::reset_db_cache();
|
ClassInfo::reset_db_cache();
|
||||||
$this->assertEquals($expect, ClassInfo::dataClassesFor(strtolower($classes[2])));
|
$this->assertEquals($expect, ClassInfo::dataClassesFor(strtolower($classes[2])));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \SilverStripe\Core\ClassInfo::classesWithExtension()
|
||||||
|
*/
|
||||||
|
public function testClassesWithExtensionUsingConfiguredExtensions()
|
||||||
|
{
|
||||||
|
$expect = [
|
||||||
|
'silverstripe\\core\\tests\\classinfotest\\extendtest' => ExtendTest::class,
|
||||||
|
'silverstripe\\core\\tests\\classinfotest\\extendtest2' => ExtendTest2::class,
|
||||||
|
'silverstripe\\core\\tests\\classinfotest\\extendtest3' => ExtendTest3::class,
|
||||||
|
];
|
||||||
|
$this->assertEquals(
|
||||||
|
$expect,
|
||||||
|
ClassInfo::classesWithExtension(ExtensionTest1::class, BaseObject::class),
|
||||||
|
'ClassInfo::testClassesWithExtension() returns class with extensions applied via class config'
|
||||||
|
);
|
||||||
|
|
||||||
|
$expect = [
|
||||||
|
'silverstripe\\core\\tests\\classinfotest\\extendtest' => ExtendTest::class,
|
||||||
|
'silverstripe\\core\\tests\\classinfotest\\extendtest2' => ExtendTest2::class,
|
||||||
|
'silverstripe\\core\\tests\\classinfotest\\extendtest3' => ExtendTest3::class,
|
||||||
|
];
|
||||||
|
$this->assertEquals(
|
||||||
|
$expect,
|
||||||
|
ClassInfo::classesWithExtension(ExtensionTest1::class, ExtendTest::class, true),
|
||||||
|
'ClassInfo::testClassesWithExtension() returns class with extensions applied via class config, including the base class'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \SilverStripe\Core\ClassInfo::classesWithExtension()
|
||||||
|
*/
|
||||||
|
public function testClassesWithExtensionUsingDynamicallyAddedExtensions()
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
[],
|
||||||
|
ClassInfo::classesWithExtension(ExtensionTest2::class, BaseObject::class),
|
||||||
|
'ClassInfo::testClassesWithExtension() returns no classes for extension that hasn\'t been applied yet.'
|
||||||
|
);
|
||||||
|
|
||||||
|
ExtendTest::add_extension(ExtensionTest2::class);
|
||||||
|
|
||||||
|
$expect = [
|
||||||
|
'silverstripe\\core\\tests\\classinfotest\\extendtest2' => ExtendTest2::class,
|
||||||
|
'silverstripe\\core\\tests\\classinfotest\\extendtest3' => ExtendTest3::class,
|
||||||
|
];
|
||||||
|
$this->assertEquals(
|
||||||
|
$expect,
|
||||||
|
ClassInfo::classesWithExtension(ExtensionTest2::class, ExtendTest::class),
|
||||||
|
'ClassInfo::testClassesWithExtension() returns class with extra extension dynamically added'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \SilverStripe\Core\ClassInfo::classesWithExtension()
|
||||||
|
*/
|
||||||
|
public function testClassesWithExtensionWithDynamicallyRemovedExtensions()
|
||||||
|
{
|
||||||
|
ExtendTest::remove_extension(ExtensionTest1::class);
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
[],
|
||||||
|
ClassInfo::classesWithExtension(ExtensionTest1::class, BaseObject::class),
|
||||||
|
'ClassInfo::testClassesWithExtension() returns no classes after an extension being removed'
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
13
tests/php/Core/ClassInfoTest/BaseObject.php
Normal file
13
tests/php/Core/ClassInfoTest/BaseObject.php
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace SilverStripe\Core\Tests\ClassInfoTest;
|
||||||
|
|
||||||
|
use SilverStripe\Core\Config\Configurable;
|
||||||
|
use SilverStripe\Core\Extensible;
|
||||||
|
use SilverStripe\Dev\TestOnly;
|
||||||
|
|
||||||
|
class BaseObject implements TestOnly
|
||||||
|
{
|
||||||
|
use Configurable;
|
||||||
|
use Extensible;
|
||||||
|
}
|
10
tests/php/Core/ClassInfoTest/ExtendTest.php
Normal file
10
tests/php/Core/ClassInfoTest/ExtendTest.php
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace SilverStripe\Core\Tests\ClassInfoTest;
|
||||||
|
|
||||||
|
class ExtendTest extends BaseObject
|
||||||
|
{
|
||||||
|
private static $extensions = [
|
||||||
|
ExtensionTest1::class,
|
||||||
|
];
|
||||||
|
}
|
7
tests/php/Core/ClassInfoTest/ExtendTest2.php
Normal file
7
tests/php/Core/ClassInfoTest/ExtendTest2.php
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace SilverStripe\Core\Tests\ClassInfoTest;
|
||||||
|
|
||||||
|
class ExtendTest2 extends ExtendTest
|
||||||
|
{
|
||||||
|
}
|
7
tests/php/Core/ClassInfoTest/ExtendTest3.php
Normal file
7
tests/php/Core/ClassInfoTest/ExtendTest3.php
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace SilverStripe\Core\Tests\ClassInfoTest;
|
||||||
|
|
||||||
|
class ExtendTest3 extends ExtendTest2
|
||||||
|
{
|
||||||
|
}
|
10
tests/php/Core/ClassInfoTest/ExtensionTest1.php
Normal file
10
tests/php/Core/ClassInfoTest/ExtensionTest1.php
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace SilverStripe\Core\Tests\ClassInfoTest;
|
||||||
|
|
||||||
|
use SilverStripe\Core\Extension;
|
||||||
|
use SilverStripe\Dev\TestOnly;
|
||||||
|
|
||||||
|
class ExtensionTest1 extends Extension implements TestOnly
|
||||||
|
{
|
||||||
|
}
|
10
tests/php/Core/ClassInfoTest/ExtensionTest2.php
Normal file
10
tests/php/Core/ClassInfoTest/ExtensionTest2.php
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace SilverStripe\Core\Tests\ClassInfoTest;
|
||||||
|
|
||||||
|
use SilverStripe\Core\Extension;
|
||||||
|
use SilverStripe\Dev\TestOnly;
|
||||||
|
|
||||||
|
class ExtensionTest2 extends Extension implements TestOnly
|
||||||
|
{
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user