mbdax/microsoftgraphbundle
Symfony bundle for integrating the Microsoft Graph API into your PHP application. It provides preconfigured services and DI setup so you can query Microsoft 365 users, mail, calendars, files and Teams through a single, OAuth-authenticated client with framework-native configuration.
v0.1.0 is the initial public release, so treat it as pre-1.0: pin the exact version and read the source before relying on it. The release notes are empty, which means there is no documented changelog, upgrade path, or stability guarantee yet — verify behavior directly against src/ and the test suite.
Minimal steps:
composer require vendor/package:0.1.0
php artisan vendor:publish --provider="Vendor\Package\PackageServiceProvider"
php artisan migrate # only if the package ships migrations
Where to look first:
composer.json — check extra.laravel.providers / aliases (auto-discovery), the Laravel version constraint, and whether the package is 0.1.x only.README.md and any docs/ — installation and the single "hello world" example.src/*ServiceProvider.php — what is bound, published, loaded, and registered.config/*.php — every knob and its default.tests/ — the most reliable description of intended behavior for a 0.x package.First use case: install it, publish config, run migrations if present, then resolve the main class from the container in php artisan tinker (or a throwaway route/command) to confirm wiring before integrating it anywhere real:
app(\Vendor\Package\TheMainClass::class);
If that resolves and a trivial call succeeds, the package is wired correctly and you can move on to real integration.
Config-first setup. Publish the config file, commit it, and drive the package from config rather than hard-coding values. For a 0.x package this also gives you a single place to adapt when defaults change.
Wrap it behind your own adapter. Because the public API is not stable at 0.1.0, inject the package's class into a small application-level service or interface rather than calling it from controllers, jobs, and Blade views. When 0.2.0 renames something, you change one file.
final class Thumbnailer
{
public function __construct(private \Vendor\Package\Client $client) {}
public function make(string $path): string
{
return $this->client->process($path);
}
}
Constructor injection over facades/helpers. Resolve the package's contracts through the container so tests can swap them. Bind the package interface to its implementation in a dedicated AppServiceProvider or module provider if you need to decorate it.
Feature-test the integration, not the package. Use RefreshDatabase and assert on your adapter's output. Add one smoke test that boots the provider so a future release that breaks auto-discovery fails CI loudly.
Common workflows to expect: an Artisan command for setup/sync, publishable config and migrations, and optionally events or jobs. Register any package events in your EventServiceProvider and make queued work idempotent — 0.x packages frequently change job payloads.
Integration tips:
php artisan config:cache in staging early; it surfaces config-file assumptions that fail only in production.^0.1 allows 0.1.x patches only, but many authors treat minor bumps as breaking. Prefer "vendor/package": "0.1.*" and commit composer.lock. Do not use ^0.1 and assume safety.vendor/ between installs or pin hard. Watch the repo's commits and issues for the real behavior changes.php artisan config:clear; a stale cached config is the most common "the package ignores my settings" bug.extra.laravel is present, the provider registers automatically. If you disabled discovery or are on an older skeleton, add the provider manually and run php artisan package:discover -v.vendor:publish --tag=...) from loadMigrationsFrom(). Never edit files in vendor/; copy and adjust published migrations instead.require block against your Laravel/PHP version before upgrading. A missing upper bound on illuminate/* can let Composer install an incompatible combination.php artisan about, php artisan package:discover -v, and app()->bound(\Vendor\Package\Client::class) to confirm registration. For resolution errors, check the provider's register() vs boot() split — bindings must be in register().src/ and run your smoke test. Assume breaking changes until 1.0.0.How can I help you explore Laravel packages today?