Source of file Backend.php
Size: 6,677 Bytes - Last Modified: 2021-12-24T06:51:36+00:00
/var/www/docs.ssmods.com/process/src/src/Storage/Backends/SilverStripeOrm/Backend.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 | <?php namespace Heystack\Core\Storage\Backends\SilverStripeOrm; use Heystack\Core\Exception\ConfigurationException; use Heystack\Core\DataObjectGenerate\DataObjectGenerator; use Heystack\Core\Identifier\Identifier; use Heystack\Core\Identifier\IdentifierInterface; use Heystack\Core\Storage\BackendInterface; use Heystack\Core\Storage\Event; use Heystack\Core\Storage\StorableInterface; use Heystack\Core\DataObjectSchema\SchemaService; use Heystack\Core\DataObjectSchema\SchemaInterface; use Heystack\Core\Traits\HasEventServiceTrait; use Heystack\Core\Traits\HasSchemaServiceTrait; use Heystack\Core\Traits\HasGeneratorServiceTrait; use Heystack\Core\EventDispatcher; /** * Stores StorableInterfaces intro the SilverStripe database * * @package Heystack\Core\Storage\Backends\SilverStripeOrm * @author Cam Spiers <cameron@heyday.co.nz> */ class Backend implements BackendInterface { use HasEventServiceTrait; use HasSchemaServiceTrait; use HasGeneratorServiceTrait; /** * The identifier for this backend */ const IDENTIFIER = 'silverstripe_orm'; /** * @var \Heystack\Core\Storage\StorableInterface[] */ private $referenceDataProviders = []; /** * @param \Heystack\Core\DataObjectGenerate\DataObjectGenerator $generatorService * @param \Heystack\Core\DataObjectSchema\SchemaService $schemaService * @param \Heystack\Core\EventDispatcher $eventService */ public function __construct( DataObjectGenerator $generatorService, SchemaService $schemaService, EventDispatcher $eventService ) { $this->generatorService = $generatorService; $this->schemaService = $schemaService; $this->eventService = $eventService; } /** * @param \Heystack\Core\Storage\StorableInterface $referenceDataProvider * @return void */ public function addReferenceDataProvider(StorableInterface $referenceDataProvider) { $this->referenceDataProviders[$referenceDataProvider->getStorableIdentifier()] = $referenceDataProvider; } /** * @param \Heystack\Core\Identifier\IdentifierInterface $identifier * @return \Heystack\Core\Storage\StorableInterface */ public function getReferenceDataProvider(IdentifierInterface $identifier) { return $this->referenceDataProviders[$identifier->getFull()]; } /** * @param \Heystack\Core\Identifier\IdentifierInterface $referenceDataProviderIdentifier * @return bool */ public function hasReferenceDataProvider(IdentifierInterface $referenceDataProviderIdentifier) { return isset($this->referenceDataProviders[$referenceDataProviderIdentifier->getFull()]); } /** * @return \Heystack\Core\Identifier\Identifier */ public function getIdentifier() { return new Identifier(self::IDENTIFIER); } /** * @param \Heystack\Core\Storage\StorableInterface $object * @return mixed * @throws \Heystack\Core\Exception\ConfigurationException */ public function write(StorableInterface $object) { $schemaIdentifier = strtolower($object->getSchemaName()); $storedObject = $this->writeStoredDataObject( $this->schemaService->getSchema($schemaIdentifier), $object ); $this->eventService->dispatch( self::IDENTIFIER . '.' . $object->getStorableIdentifier() . '.stored', new Event($storedObject->ID) ); return $storedObject; } /** * @param \Heystack\Core\DataObjectSchema\SchemaInterface $schema * @param \Heystack\Core\Storage\StorableInterface $object * @return mixed * @throws \Heystack\Core\Exception\ConfigurationException */ protected function writeStoredDataObject( SchemaInterface $schema, StorableInterface $object ) { $identifier = $schema->getIdentifier()->getFull(); $saveable = sprintf('Stored%s', $identifier); $storedObject = \Injector::inst()->create($saveable); $writeableData = $object->getStorableData(); foreach ($schema->getFlatStorage() as $key => $value) { $reference = $this->generatorService->isReference($value); if ($reference) { $referenceSchema = $this->schemaService->getSchema($reference); $referenceSchemaIdentifier = $referenceSchema->getIdentifier(); if ($this->hasReferenceDataProvider($referenceSchemaIdentifier)) { $referenceData = $this->getReferenceDataProvider($referenceSchemaIdentifier)->getStorableData(); foreach (array_keys($referenceSchema->getFlatStorage()) as $referenceKey) { if (isset($referenceData['flat'][$referenceKey])) { $storedObject->{$key . $referenceKey} = $referenceData['flat'][$referenceKey]; } else { throw new ConfigurationException("No data found for key: $key on identifier: $reference"); } } } else { throw new ConfigurationException( sprintf( 'Reference in flat schema didn\'t have an associated data provider for identifier `%s`' . ' available identifiers are `%s`', $referenceSchema->getIdentifier()->getFull(), implode(', ', array_keys($this->referenceDataProviders)) ) ); } } else { if (array_key_exists($key, $writeableData['flat'])) { $value = $writeableData['flat'][$key]; $storedObject->$key = $value; if (!is_null($value) && !is_scalar($value)) { throw new ConfigurationException( "Non-scalar value found for key: $key on identifier: " . $object->getStorableIdentifier() ); } } else { throw new ConfigurationException( "No data found for key: $key on identifier: " . $object->getStorableIdentifier() ); } } } if (isset($writeableData['parent']) && isset($writeableData['flat']['ParentID'])) { $storedObject->ParentID = $writeableData['flat']['ParentID']; } $storedObject->write(); return $storedObject; } } |