diff --git a/src/Control/Controller.php b/src/Control/Controller.php index 3cb1b9833..29c802a95 100644 --- a/src/Control/Controller.php +++ b/src/Control/Controller.php @@ -230,7 +230,9 @@ class Controller extends RequestHandler implements TemplateGlobalProvider */ protected function prepareResponse($response) { - if ($response instanceof HTTPResponse) { + if (!is_object($response)) { + $this->getResponse()->setBody($response); + } elseif ($response instanceof HTTPResponse) { if (isset($_REQUEST['debug_request'])) { $class = static::class; Debug::message( diff --git a/src/Core/ClassInfo.php b/src/Core/ClassInfo.php index 377320d80..0c98e9cd8 100644 --- a/src/Core/ClassInfo.php +++ b/src/Core/ClassInfo.php @@ -400,7 +400,7 @@ class ClassInfo */ public static function hasMethod($object, $method) { - if (empty($object)) { + if (empty($object) || (!is_object($object) && !is_string($object))) { return false; } if (method_exists($object, $method)) { diff --git a/tests/php/Core/ClassInfoTest.php b/tests/php/Core/ClassInfoTest.php index 76050e34b..29721599b 100644 --- a/tests/php/Core/ClassInfoTest.php +++ b/tests/php/Core/ClassInfoTest.php @@ -2,6 +2,7 @@ namespace SilverStripe\Core\Tests; +use DateTime; use ReflectionException; use SilverStripe\Core\ClassInfo; use SilverStripe\Core\Tests\ClassInfoTest\BaseClass; @@ -15,6 +16,7 @@ use SilverStripe\Core\Tests\ClassInfoTest\ExtensionTest1; use SilverStripe\Core\Tests\ClassInfoTest\ExtensionTest2; use SilverStripe\Core\Tests\ClassInfoTest\GrandChildClass; use SilverStripe\Core\Tests\ClassInfoTest\HasFields; +use SilverStripe\Core\Tests\ClassInfoTest\HasMethod; use SilverStripe\Core\Tests\ClassInfoTest\NoFields; use SilverStripe\Core\Tests\ClassInfoTest\WithCustomTable; use SilverStripe\Core\Tests\ClassInfoTest\WithRelation; @@ -266,9 +268,57 @@ class ClassInfoTest extends SapphireTest ); } - /** - * @dataProvider provideClassSpecCases - */ + /** @dataProvider provideHasMethodCases */ + public function testHasMethod($object, $method, $output) + { + $this->assertEquals( + $output, + ClassInfo::hasMethod($object, $method) + ); + } + + public function provideHasMethodCases() + { + return [ + 'Basic object' => [ + new DateTime(), + 'format', + true, + ], + 'CustomMethod object' => [ + new HasMethod(), + 'example', + true, + ], + 'Class Name' => [ + 'DateTime', + 'format', + true, + ], + 'FQCN' => [ + '\DateTime', + 'format', + true, + ], + 'Invalid FQCN' => [ + '--GreatTime', + 'format', + false, + ], + 'Integer' => [ + 1, + 'format', + false, + ], + 'Array' => [ + ['\DateTime'], + 'format', + false, + ], + ]; + } + + /** @dataProvider provideClassSpecCases */ public function testParseClassSpec($input, $output) { $this->assertEquals( diff --git a/tests/php/Core/ClassInfoTest/HasMethod.php b/tests/php/Core/ClassInfoTest/HasMethod.php new file mode 100644 index 000000000..dbe70a7d5 --- /dev/null +++ b/tests/php/Core/ClassInfoTest/HasMethod.php @@ -0,0 +1,19 @@ +