API Allow dataobject get_one without passing a class

add class validation early in get_one()
This commit is contained in:
Andrew Aitken-Fincham 2018-10-15 14:27:09 +01:00 committed by Guy Sartorelli
parent 2ae52120c1
commit f2de39162d
No known key found for this signature in database
GPG Key ID: F313E3B9504D496A
2 changed files with 21 additions and 5 deletions

View File

@ -3399,24 +3399,34 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
* $member = DataObject::get_one('Member', [ '"FirstName"' => 'John' ]);
* </code>
*
* @param string $callerClass The class of objects to be returned
* @param string|null $callerClass The class of objects to be returned. Defaults to the class that calls the method
* e.g. MyObject::get_one() will return a MyObject
* @param string|array $filter A filter to be inserted into the WHERE clause.
* @param boolean $cache Use caching
* @param string $orderby A sort expression to be inserted into the ORDER BY clause.
* @param string $orderBy A sort expression to be inserted into the ORDER BY clause.
*
* @return DataObject|null The first item matching the query
*/
public static function get_one($callerClass, $filter = "", $cache = true, $orderby = "")
public static function get_one($callerClass = null, $filter = "", $cache = true, $orderBy = "")
{
if ($callerClass === null) {
$callerClass = static::class;
}
// Validate class
if ($callerClass === self::class) {
throw new InvalidArgumentException('DataObject::get_one() cannot query non-subclass DataObject directly');
}
/** @var DataObject $singleton */
$singleton = singleton($callerClass);
$cacheComponents = [$filter, $orderby, $singleton->getUniqueKeyComponents()];
$cacheComponents = [$filter, $orderBy, $singleton->getUniqueKeyComponents()];
$cacheKey = md5(serialize($cacheComponents));
$item = null;
if (!$cache || !isset(self::$_cache_get_one[$callerClass][$cacheKey])) {
$dl = DataObject::get($callerClass)->where($filter)->sort($orderby);
$dl = DataObject::get($callerClass)->where($filter)->sort($orderBy);
$item = $dl->first();
if ($cache) {

View File

@ -436,6 +436,12 @@ class DataObjectTest extends SapphireTest
$this->assertEquals('Bob', $comment->Name);
$comment = DataObject::get_one(DataObjectTest\TeamComment::class, '', true, '"Name" DESC');
$this->assertEquals('Phil', $comment->Name);
// Test get_one() without passing classname
$this->assertEquals(
DataObjectTest\TeamComment::get_one(),
DataObject::get_one(DataObjectTest\TeamComment::class)
);
}
public function testGetByIDCallerClass()