@@ -61,19 +61,39 @@ public function __construct($dependentEntities = null)
6161 * @param EntityDataObject $entityObject
6262 * @param array $operationMetadata
6363 * @param string $operation
64+ * @param integer $depth
6465 * @return array
6566 * @throws \Exception
6667 */
67- public function resolveOperationDataArray ($ entityObject , $ operationMetadata , $ operation )
68+ public function resolveOperationDataArray ($ entityObject , $ operationMetadata , $ operation, $ depth = 0 )
6869 {
6970 $ operationDataArray = [];
7071 self ::incrementSequence ($ entityObject ->getName ());
7172
7273 foreach ($ operationMetadata as $ operationElement ) {
7374 if ($ operationElement ->getType () == OperationElementExtractor::OPERATION_OBJECT_OBJ_NAME ) {
7475 $ entityObj = $ this ->resolveOperationObjectAndEntityData ($ entityObject , $ operationElement ->getValue ());
75- $ operationDataArray [$ operationElement ->getKey ()] =
76- $ this ->resolveOperationDataArray ($ entityObj , $ operationElement ->getNestedMetadata (), $ operation );
76+ if (null === $ entityObj && $ operationElement ->getRequired ()) {
77+ throw new \Exception (sprintf (
78+ self ::EXCEPTION_REQUIRED_DATA ,
79+ $ operationElement ->getType (),
80+ $ operationElement ->getKey (),
81+ $ entityObject ->getName ()
82+ ));
83+ } elseif (null === $ entityObj ) {
84+ continue ;
85+ }
86+ $ operationData = $ this ->resolveOperationDataArray (
87+ $ entityObj ,
88+ $ operationElement ->getNestedMetadata (),
89+ $ operation ,
90+ $ depth +1
91+ );
92+ if ($ depth == 0 ) {
93+ $ operationDataArray [$ operationElement ->getKey ()] = $ operationData ;
94+ } else {
95+ $ operationDataArray = $ operationData ;
96+ }
7797 continue ;
7898 }
7999
@@ -127,7 +147,8 @@ public function resolveOperationDataArray($entityObject, $operationMetadata, $op
127147 $ operationDataSubArray = $ this ->resolveNonPrimitiveElement (
128148 $ entityName ,
129149 $ operationElement ,
130- $ operation
150+ $ operation ,
151+ $ depth
131152 );
132153
133154 if ($ operationElement ->getType () == OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY ) {
@@ -216,8 +237,12 @@ private function resolveOperationObjectAndEntityData($entityObject, $operationEl
216237 {
217238 if ($ operationElementValue != $ entityObject ->getType ()) {
218239 // if we have a mismatch attempt to retrieve linked data and return just the first linkage
219- $ linkName = $ entityObject ->getLinkedEntitiesOfType ($ operationElementValue )[0 ];
220- return DataObjectHandler::getInstance ()->getObject ($ linkName );
240+ $ linkName = $ entityObject ->getLinkedEntitiesOfType ($ operationElementValue );
241+ if (!empty ($ linkName )) {
242+ $ linkName = $ linkName [0 ];
243+ return DataObjectHandler::getInstance ()->getObject ($ linkName );
244+ }
245+ return null ;
221246 }
222247
223248 return $ entityObject ;
@@ -229,9 +254,10 @@ private function resolveOperationObjectAndEntityData($entityObject, $operationEl
229254 * @param string $entityName
230255 * @param OperationElement $operationElement
231256 * @param string $operation
257+ * @param integer $depth
232258 * @return array
233259 */
234- private function resolveNonPrimitiveElement ($ entityName , $ operationElement , $ operation )
260+ private function resolveNonPrimitiveElement ($ entityName , $ operationElement , $ operation, $ depth )
235261 {
236262 $ linkedEntityObj = $ this ->resolveLinkedEntityObject ($ entityName );
237263
@@ -242,10 +268,11 @@ private function resolveNonPrimitiveElement($entityName, $operationElement, $ope
242268 $ operationSubArray = $ this ->resolveOperationDataArray (
243269 $ linkedEntityObj ,
244270 [$ operationElement ->getNestedOperationElement ($ operationElement ->getValue ())],
245- $ operation
271+ $ operation ,
272+ $ depth +1
246273 );
247274
248- return $ operationSubArray[ $ operationElement -> getValue ()] ;
275+ return $ operationSubArray ;
249276 }
250277
251278 $ operationMetadata = OperationDefinitionObjectHandler::getInstance ()->getOperationDefinition (
0 commit comments