PHP Enum do not support missing values, this causes my synchronization job schema get request to fail.
还没有人认领这个 Issue。
评估
调研方向
从 Enum.php 第 57 行附近以及 AttributeDefinitionMetadata 示例开始;检查如何反序列化 Secret 之类的未知值。将 PHP 的行为与所引用的 Java forValue 示例进行比较,然后验证同步 schema 请求可以处理未知的 enum 值而不会失败。
由索引模型根据 Issue 内容生成。
描述
Describe the bug
I am trying to trigger on an on-demand provisioning job and need to get the synchronization rule ID to do so.
When I get query the api directly, I get a valid response
GET https://graph.microsoft.com/beta/servicePrincipals/xxxxxxx/synchronization/jobs/scim.7d175e27e908439982db3a45414e55e0.b36480ed-cde1-4a8f-aeab-a6a0b8f8d65d/schema?$select=id
Response
The document I refer to is Get synchronizationSchema
https://learn.microsoft.com/en-us/graph/api/synchronization-synchronizationschema-get?view=graph-rest-beta&tabs=http
However, when I run it, I get the error: "Handling "App\Message\GetSynchronisationRuleIdMessage" failed: Invalid enum value Secret ".
Expected behavior
Graceful exception handling, when a missing enum value is present.
How to reproduce
public function handleGetSynchronisationRuleIdMessage(
GetSynchronisationRuleIdMessage $message
): string
{
$result = $this->graphServiceClient
->servicePrincipals()
->byServicePrincipalId($message->servicePrincipalId)
->synchronization()
->jobs()
->bySynchronizationJobId($message->synchronizationJobId)
->schema()
->get()
->wait();
return $result->getSynchronizationRules()[0]->getId() ??
throw new Exception(sprintf("No Rule found for job %s", $message->synchronizationJobId));
}
SDK Version
2.19
Latest version known to work for scenario above?
No response
Known Workarounds
(failed)
Microsoft support informed me I can bypass the error by querying for the synchronizationRules only using one of the following:
$requestConfig = new MessagesRequestBuilderGetRequestConfiguration();
$requestConfig->queryParameters = MessagesRequestBuilderGetRequestConfiguration::createQueryParameters();
$requestConfig->queryParameters->select = ['synchronizationRules'];
// or with PHP 8
$requestConfig = new MessagesRequestBuilderGetRequestConfiguration(
queryParameters: MessagesRequestBuilderGetRequestConfiguration::createQueryParameters(
select: ['synchronizationRules']
)
);
Reason: select is not supported for this endpoint.
Debug output
Click to expand log
``` Handling "App\Message\GetSynchronisationRuleIdMessage" failed: Invalid enum value Secret ".</details>
### Configuration
_No response_
### Other information
### My Analyses
The problem I am having this error is because the way enums are handled inside php sdk.
### Enum.php

See line: 57.
So when we receive a value, which is not supported. We get this exception.
```php
<?php
namespace Microsoft\Graph\Beta\Generated\Models;
use Microsoft\Kiota\Abstractions\Enum;
class AttributeDefinitionMetadata extends Enum {
public const BASE_ATTRIBUTE_NAME = 'BaseAttributeName';
public const COMPLEX_OBJECT_DEFINITION = 'ComplexObjectDefinition';
public const IS_CONTAINER = 'IsContainer';
public const IS_CUSTOMER_DEFINED = 'IsCustomerDefined';
public const IS_DOMAIN_QUALIFIED = 'IsDomainQualified';
public const LINK_PROPERTY_NAMES = 'LinkPropertyNames';
public const LINK_TYPE_NAME = 'LinkTypeName';
public const MAXIMUM_LENGTH = 'MaximumLength';
public const REFERENCED_PROPERTY = 'ReferencedProperty';
}
While If you look how java implements Enums.
This is my reasoning:
The Enum Requires that all values are defined.
"Secret"-value is not a defined value.
This bug is the php sdk, BUT in the Java SDK.
This problem is solved differently.
When an enum value does not exit.
It just return null.
package com.microsoft.graph.models;
import com.microsoft.kiota.serialization.ValuedEnum;
import java.util.Objects;
@jakarta.annotation.Generated("com.microsoft.kiota")
public enum AttributeDefinitionMetadata implements ValuedEnum {
BaseAttributeName("BaseAttributeName"),
ComplexObjectDefinition("ComplexObjectDefinition"),
IsContainer("IsContainer"),
IsCustomerDefined("IsCustomerDefined"),
IsDomainQualified("IsDomainQualified"),
LinkPropertyNames("LinkPropertyNames"),
LinkTypeName("LinkTypeName"),
MaximumLength("MaximumLength"),
ReferencedProperty("ReferencedProperty");
public final String value;
AttributeDefinitionMetadata(final String value) {
this.value = value;
}
@jakarta.annotation.Nonnull
public String getValue() { return this.value; }
@jakarta.annotation.Nullable
public static AttributeDefinitionMetadata forValue(@jakarta.annotation.Nonnull final String searchValue) {
Objects.requireNonNull(searchValue);
switch(searchValue) {
case "BaseAttributeName": return BaseAttributeName;
case "ComplexObjectDefinition": return ComplexObjectDefinition;
case "IsContainer": return IsContainer;
case "IsCustomerDefined": return IsCustomerDefined;
case "IsDomainQualified": return IsDomainQualified;
case "LinkPropertyNames": return LinkPropertyNames;
case "LinkTypeName": return LinkTypeName;
case "MaximumLength": return MaximumLength;
case "ReferencedProperty": return ReferencedProperty;
default: return null;
}
}
}
- 主要语言
- PHP
- 星标
- 13
- 派生
- 8
- 平均合并
- 14 小时 58 分钟
- 30 天内合并 PR
- 3
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
microsoftgraph/msgraph-beta-sdk-php 的其他 Issue
-
dependency:metadata ToTriage type:bug
难度 4/5 3-5 天 新手友好度 38/100
microsoftgraph/msgraph-beta-sdk-php#356 · 1 条评论 ·
-
dependency:metadata ToTriage type:bug
难度 2/5 1-3 小时 新手友好度 48/100
microsoftgraph/msgraph-beta-sdk-php#321 · 1 条评论 ·
-
ToTriage type:enhancement
难度 2/5 1-3 小时 新手友好度 55/100
microsoftgraph/msgraph-beta-sdk-php#309 · 1 条评论 ·
查看 microsoftgraph/msgraph-beta-sdk-php 的全部 Issue
相似的 Issue
-
sync-en
难度 1/5 1-3 小时 新手友好度 85/100
-
sync-en
难度 1/5 1-3 小时 新手友好度 85/100
-
Перевод устарел
难度 1/5 1-3 小时 新手友好度 78/100
-
难度 1/5 1 小时以内 新手友好度 90/100
-
难度 2/5 1-3 小时 新手友好度 85/100