KevinB: Mittels Micrsoft Graph API einen Kalendereintrag für einen Benutzer erstellen

Hallo,

wir werden bald auch Mitglied der MS Sekte und wechseln zu O365. Um unsere bisherigen intern wunderbar funktionierenden Dienste weiter nutzen zu können, bin ich auf der Suche, wie ich einen Kalendereintrag für einen Benutzer über die Microsoft Graph API erstellen kann.

Die APP-Registrierung ist erfolgt und die Berechtigung erteilt. Der Zugriff bspw. um den Benutzernamen über die Mail-Adresse zu bekommen funktioniert auch schonmal.

Der Code dafür sieht bspw wie folgt aus:

require_once '../vendor/autoload.php'; // Path to Microsoft Graph SDK and OAuth2 Client library

use Microsoft\Kiota\Authentication\Oauth\ClientCredentialContext;
use Microsoft\Kiota\Abstractions\ApiException;
use Microsoft\Graph\Core\Authentication\GraphPhpLeagueAuthenticationProvider;
use Microsoft\Graph\GraphServiceClient;

$tokenContext = new ClientCredentialContext(
    $tenantId,
    $clientId,
    $clientSecret);

$graphServiceClient = new GraphServiceClient($tokenContext);

try {
    $user = $graphServiceClient->users()->byUserId('max.mustermann@example.com')->get()->wait();
    echo "User Name = {$user->getDisplayName()} <br/>";

} catch (ApiException $ex) {
    echo "Fehler: ".$ex->getError()->getMessage();
	exit;
}

Aber der folgende Versuch einen Kalendereintrag zu schreiben

$requestBody = new Event();
$requestBody->setSubject('Let\'s go for lunch');
$body = new ItemBody();
$body->setContentType(new BodyType('hTML'));
$body->setContent('Does noon work for you?');
$requestBody->setBody($body);
$start = new DateTimeTimeZone();
$start->setDateTime('2024-02-22T12:00:00');
$start->setTimeZone(new DateTimeZone('Europe/Berlin'));
$requestBody->setStart($start);
$end = new DateTimeTimeZone();
$end->setDateTime('2024-02-22T13:00:00');
$end->setTimeZone(new DateTimeZone('Europe/Berlin'));
$requestBody->setEnd($end);
$location = new Location();
$location->setDisplayName('Harry\'s Bar');
$requestBody->setLocation($location);

$result = $graphServiceClient->users()->byUserId('max.mustermann@example.com')->events()->post($requestBody, $requestConfiguration)->wait();

erzeugt den Fehler Fatal error: Uncaught Error: Class 'Event' not found

Was habe ich falsch gemacht oder vergessen? In Beispiele von MS sind da leider nicht erleuchtend.

LG KevinB

  1. Lieber KevinB,

    Fatal error: Uncaught Error: Class 'Event' not found

    Deine use-Statements enthalten offensichtlich nicht den notwendigen Namensraum für Event, was die Fehlermeldung auslöst. Ist die Event-Klasse in Microsoft\Kiota oder Microsoft\Graph? Oder ganz wo anders?

    Liebe Grüße

    Felix Riesterer

    1. Hallo Felix,

      Deine use-Statements enthalten offensichtlich nicht den notwendigen Namensraum für Event, was die Fehlermeldung auslöst. Ist die Event-Klasse in Microsoft\Kiota oder Microsoft\Graph? Oder ganz wo anders?

      Das ist auch meine Vermutung, allerdings gibt es bei MS keinen Hinweis darauf, wo die Event-Klasse zu finden ist und wie ich sie einbinden müsste. 🥺

      LG KevinB

      1. Hallo KevinB,

        ja, ich finde auch dass die PHP Doku nicht so toll ist. Ich finde die ganze Doku Microsoft-typisch SCHROTT. Haufenweise Text, und man weiß meistens nicht, wovon die überhaupt reden. Und die Beispiele sind entweder unvollständig oder demonstrieren komplexe Sonderfälle, bei denen man keine Ahnung hat, was sie mit den eigenen ersten tapsigen Schritten zu tun haben könnten.

        In der Referenz findet man einen Hinweis: event ist ein resource Type und liegt im Namespace microsoft.graph. Im C# Beispiel zu "create event" findet man allerdings ein "using Microsoft.Graph.Models;"

        Damit hätte man nun 2 Kandidaten für einen USE in PHP: Microsoft.Graph oder Microsoft.Graph.Models.

        Man könnte auch die Sourcen durchstöbern, die einem der Composer beschert, und schauen, in welchem Ordner oder Namespace das Event.php steckt.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo Rolf,

          In der Referenz findet man einen Hinweis: event ist ein resource Type und liegt im Namespace microsoft.graph. Im C# Beispiel zu "create event" findet man allerdings ein "using Microsoft.Graph.Models;"

          Damit hätte man nun 2 Kandidaten für einen USE in PHP: Microsoft.Graph oder Microsoft.Graph.Models.

          Ich hatte mir auch die anderen Code-Beispiele mal angeschaut und bei allen sieht es etwas anders aus. Ich hab auch schon alles mögliche über Try&Error probiert, aber bisher ohne Erfolg.

          Man könnte auch die Sourcen durchstöbern, die einem der Composer beschert, und schauen, in welchem Ordner oder Namespace das Event.php steckt.

          Auch die Sourcen habe ich schon durchstöbert, bin aber leider nicht fündig geworden.

          Einiges liegt unter \vendor\microsoft\microsoft-graph\src\Generated
          Dort unter Models\ habe ich eine Event.php gefunden, aber auch ein use Microsoft\Graph\Generated\Models; hatte keine Wirkung.

          Wenn ich allerdings use Microsoft\Graph\Generated\Models\Event; eintrage, bekomme ich eine neue Fehlermeldung, dass Itembodyfehlt.

          Ich habe dann die benötigten Klassen einzeln angegeben:

          use Microsoft\Graph\Generated\Models\Event;
          use Microsoft\Graph\Generated\Models\ItemBody;
          use Microsoft\Graph\Generated\Models\BodyType;
          use Microsoft\Graph\Generated\Models\DateTimeTimeZone;
          use Microsoft\Graph\Generated\Models\Location;
          

          Jetzt kommt eine neue Fehlermeldung: Fatal error: Uncaught InvalidArgumentException: Invalid enum value hTML in vendor/microsoft/kiota-abstractions/src/Enum.php:55

          Laut BodyType.php muss hier alles in Kleinbuchstaben stehen, also "html" oder "text". Vielen Dank auch für das tolle Beispiel Microsoft. 😡

          Das Gerappel mit dem $requestConfiguration = new EventsRequestBuilderPostRequestConfiguration(); hab ich nun einfach mal weggelassen, vielleicht brauch ich das auch (erstmal) nicht.

          Und siehe da... keine Fehlermeldung mehr, jede Menge Return-Code, aber auch kein Eintrag in meinem Kalender 🥺 ... also noch weitersuchen...

          Vielen Dank erstmal für die Unterstützung.

          LG KevinB