/** * Check if reverse relation can be created * * @param ConfigProvider $extendProvider * @param array $relation * @param string $relationKey * * @return bool * * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ protected function isAvailableRelation(ConfigProvider $extendProvider, array $relation, $relationKey) { /** @var FieldConfigId|false $fieldId */ $fieldId = $relation['field_id']; /** @var FieldConfigId $targetFieldId */ $targetFieldId = $relation['target_field_id']; if (!$relation['assign'] || !$targetFieldId) { if (!$targetFieldId) { return false; } // additional check for revers relation of manyToOne field type $targetEntityConfig = $extendProvider->getConfig($targetFieldId->getClassName()); if (false === (!$relation['assign'] && !$fieldId && $targetFieldId && $targetFieldId->getFieldType() == RelationTypeBase::MANY_TO_ONE && $targetEntityConfig->get('relation') && $targetEntityConfig->get('relation')[$relationKey]['assign'])) { return false; } } if ($fieldId && $extendProvider->hasConfigById($fieldId) && $extendProvider->getConfigById($fieldId)->is('state', ExtendScope::STATE_DELETE)) { return false; } if ($targetFieldId && !$extendProvider->hasConfig($targetFieldId->getClassName(), $targetFieldId->getFieldName())) { return false; } return true; }