Unique Keys
There are several cases where you may want to generate a unique key. For example:
- populate
IDattribute in your HTML output - key for partial cache
If this is for a public-facing purpose, it is typically considered bad practice to expose the database ID,
as this provides unnecessary information to would-be attackers. Instead, for DataObject subclasses, you
can use the getUniqueKey() method.
This can be done simply by including following code in your template:
$UniqueKeyCustomisation
The unique key generation can be altered in two ways:
- you can provide extra data to be used when generating a key via an extension
- you can inject over the key generation service and write your own custom code.
Extension point
The cacheKeyComponent extension hook is invoked from DataObject::getUniqueKeyComponents().
Simply implement a cacheKeyComponent() method in an Extension applied to the DataObject class you want to affect.
The method must return a string, which will be used when generating a unique key for the record.
Some cases where this is used in supported modules already are:
- versions - an object in different version stages needs to have different unique keys for each stage
- locales - an object in different locales needs to have different unique keys for each locale
See Extensions and DataExtensions for more information about implementing and applying extensions.
Custom service
UniqueKeyService is used by default but you can use injector to override it with your custom service. For example:
SilverStripe\Core\Injector\Injector:
SilverStripe\ORM\UniqueKey\UniqueKeyService:
class: App\Service\MyCustomServiceYour custom service has to implement UniqueKeyInterface.
A use case for implementing your own service might be to produce a UUID for each record.