silverstripe-framework/src/ORM/UniqueKey/UniqueKeyService.php

41 lines
1.2 KiB
PHP

<?php
namespace SilverStripe\ORM\UniqueKey;
use Exception;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Core\Injector\Injectable;
use SilverStripe\ORM\DataObject;
/**
* Class UniqueKeyService
*
* Generate a unique key for data object
*
* recommended use:
* - when you need unique key for caching purposes
* - when you need unique id on the front end (for example JavaScript needs to target specific element)
*/
class UniqueKeyService implements UniqueKeyInterface
{
use Injectable;
/**
* @param DataObject $object
* @param array $keyComponents key components are expected to be strings (or at least scalar values)
* @return string
* @throws Exception
*/
public function generateKey(DataObject $object, array $keyComponents = []): string
{
$id = $object->isInDB() ? (string) $object->ID : bin2hex(random_bytes(16));
$class = ClassInfo::shortName($object);
$keyComponents = json_encode($keyComponents);
$hash = md5($keyComponents . $object->ClassName . $id);
// note: class name and id are added just for readability as the hash already contains all parts
// needed to create a unique key
return sprintf('%s-%s-%s', $class, $id, $hash);
}
}