lloadout/microsoftgraph
Laravel package for integrating the Microsoft Graph API. Connect your app to Microsoft 365 to work with Outlook mail, calendars, OneDrive files, Teams, and Azure AD users through a fluent interface.
Architecture fit. The package is a thin Laravel service-provider layer over Microsoft Graph, exposing two integration surfaces: a mail transport (MicrosoftGraphTransport) and a Flysystem-backed onedrive storage disk (OnedriveAdapter). That is architecturally attractive for teams already standardised on Laravel's Mail and Storage facades — adoption is configuration-level, not code-level, and it avoids bespoke Graph SDK wiring. The v1.21 changes do not alter this shape; they harden it. The Storage::extend() closure rebinding fix on Laravel 13 is a genuine framework-compatibility correction rather than a feature, and the move to explicit provider capture removes a class of container-resolution bugs that would otherwise surface only in long-running workers or Octane.
Integration feasibility. High for Laravel 10/11/12 estates already on PHP 8.2+. The package is installable via Composer with no native extensions, no sidecar service, and no queue infrastructure required. The gating factor is not the package but Azure AD: an app registration, Mail.Send (application or delegated) and Files.ReadWrite.All scopes, and tenant admin consent. That is a procurement/identity-workstream task, not an engineering one, and it typically dominates the timeline.
Technical risk.
read() now throws UnableToReadFile instead of returning false. This is a behavioural break for any caller doing falsy checks on the adapter's return value. Flysystem 3 conformance is the right call, but existing code paths that swallowed failures will now surface exceptions — desirable in production, disruptive in tests.illuminate/* constraints permit stable resolution or require --dev stability flags.Key questions.
read() semantics change documented as breaking, and is there a published upgrade note for consumers relying on false returns?Stack fit. Best fit is a Laravel 11/12 monolith or modular app on PHP 8.2–8.4, already using Storage disks and Laravel's mailer, with an existing Entra ID tenant. Poor fit for polyglot estates needing a shared Graph abstraction outside PHP, or for apps that must send mail through a provider-agnostic relay.
Migration path. From v1.20: bump PHP to 8.2+, update orchestra/testbench to 9–11 and swap nunomaduro/larastan for larastan/larastan in require-dev, then audit every call site that consumes the OneDrive disk for falsy-return handling and wrap in try/catch for UnableToReadFile. If already on Laravel 13, the Storage::extend() fix removes the need for any local workaround — delete any app-side shim added to compensate. If on Laravel 10 or PHP 8.1, pin to v1.20 and schedule the platform upgrade; do not attempt a partial bump.
Compatibility. Laravel 11, 12, and 13 with testbench 9–11; PHP 8.2 minimum, with a PHP 8.4 deprecation fix in MicrosoftGraphTransport::send() indicating active 8.4 validation. The nullable Envelope change is signature-level and should be transparent to callers, but confirm no subclass in your codebase overrides send().
Sequencing.
lloadout/microsoftgraph to v1.21 in a branch; resolve dev-dependency swaps first (testbench, larastan) so CI stays green.read() now throws" versus genuine regressions.larastan/larastan — expect new findings given the analyser change, budget time for triage noise.Maintenance. Low steady-state effort: two config entries, one service provider, no schema. The recurring cost is dependency hygiene — the package tracks Laravel majors and Flysystem interfaces, so it will force a platform upgrade roughly annually. The larastan namespace switch signals the maintainer is actively pruning abandoned dependencies, which is a positive maintenance signal.
Support. No commercial backing. Escalation path is GitHub issues, and any Graph-side incident (throttling, permission changes, API version retirement) is a shared-risk situation where you diagnose alongside the maintainer. Recommend internal ownership: one named engineer accountable for the package and the Azure app registration, plus a documented fallback (SMTP relay for mail; S3/Azure Blob for storage) that can be switched by config.
Scaling. Bounded by Microsoft Graph, not by the package. Expect per-tenant throttling on both mail send and file operations; the transport is synchronous, so high-volume mail should be queued at the Laravel layer rather than relying on the package. Large OneDrive uploads need chunked sessions — verify support before committing to bulk file workflows. Horizontal scaling of the PHP tier is unaffected; the closure-rebinding fix specifically improves safety under Octane and long-lived workers.
Failure modes.
UnableToReadFile now propagating as an uncaught exception in code written against the old false contract — the highest-likelihood post-upgrade incident.Storage::extend() registration — historically the Laravel 13 bug; now fixed, but verify after any framework bump.Ramp-up. Engineering ramp-up is roughly half a day for a mid-level Laravel developer — the API surface is the framework's own Mail and Storage facades. The real cost sits with identity: app registration, scope selection, admin consent, and secret rotation runbook, which is an Azure AD administrator task with lead time measured in days, not hours. Budget for that separately and start it before the code change, not after.
How can I help you explore Laravel packages today?