liip/oneall-bundle
LiipOneAllBundle integrates OneAll social login and user management into Symfony applications, providing configuration and services to connect users through social networks and access OneAll APIs for authentication and profile data.
The 1.0.0 release is the first stable tag, so treat it as the baseline contract: the public API, config keys, and published assets are now covered by semver. There is no prior assessment to diff against, so verify the surface yourself rather than assuming stability from a pre-1.0 branch.
First moves, in order:
src/*ServiceProvider.php (or Providers/) before anything else. It tells you what is bound into the container, which singletons are registered, what is publishable, and whether anything is deferred. Ninety percent of "how do I use this" questions are answered there.publishes() calls — config, migrations, views, translations, assets. Run php artisan vendor:publish --provider="Vendor\Package\PackageServiceProvider" --tag=config (adjust tag) and read the generated config file end to end. The config file is the package's de facto documentation.composer.json. Confirm the illuminate/* constraints against your Laravel version, and check extra.laravel.providers / aliases for package auto-discovery. If discovery is declared, you do not register the provider manually.src/Contracts/ (or interfaces) shows what is swappable and what is safe to depend on. Anything you can type-hint against an interface is a stable seam; anything you resolve as a concrete class is an implementation detail.composer test or vendor/bin/phpunit) if the package ships tests — it confirms the package works against your PHP/Laravel combo before you build on it.First use case: get the happy path working end to end in a throwaway route or an artisan tinker session before wiring it into application code. Resolve the package's main entry point from the container (app(MainClass::class)), run one operation, and inspect the result. This surfaces missing migrations, missing config keys, and required env vars in about two minutes.
Resolve from the container, never new. The package almost certainly registers bindings so that config, HTTP clients, and loggers are injected. Constructing the class yourself bypasses that and usually produces "config is null" errors in tests.
public function __construct(private PackageClient $client) {}
Prefer the facade for terse call sites, the interface for testability. Facades are convenient in controllers and Blade; injecting the underlying contract is better in services and jobs because it keeps the dependency explicit and lets you swap in a fake without Facade::shouldReceive.
Wrap third-party calls in your own thin adapter. Even at 1.0.0, the package's method signatures may shift in a 2.x. A single App\Support\PackageAdapter class that delegates means a future upgrade touches one file instead of forty.
Configure per-environment, not per-call. Publish the config, commit it, and drive environment differences through .env values referenced in the config file. Resist the urge to mutate config at runtime (config(['package.key' => ...])) inside request handling — it is invisible to anyone reading the config and it does not survive Octane workers cleanly.
Use the package's queue integration rather than rolling your own. If it ships jobs or a queue config block, prefer those — they typically handle retries, backoff, and serialization correctly. If you need to call it from a job, keep the job payload small (IDs, scalars) and re-resolve the client inside handle().
Testing pattern: bind a fake in setUp() via the container rather than hitting the network.
protected function setUp(): void
{
parent::setUp();
$this->app->instance(PackageClientContract::class, new FakePackageClient());
}
If the package ships its own fakes or Http::fake()-compatible clients, use them — they track the package's own request shapes and will not drift.
Integration tip: if the package exposes events, listen to them rather than polling or subclassing. Event listeners are the lowest-coupling integration point and survive internal refactors.
php artisan config:cache will freeze any config keys added in 1.0.0. After upgrading, always run php artisan config:clear (and optimize:clear in production) before debugging a "config value is missing" error.vendor:publish --force will happily overwrite your edited config and migrations with the package defaults. Publish once, record the published file paths in your README or onboarding doc, and diff against the package's stubs when upgrading instead of re-publishing.extra.laravel.providers, you will get double registration — often visible as duplicated event listeners or a "class already bound" style error. Pick one.loadMigrationsFrom) or expects you to publish them. If it publishes, they become your migrations — you own naming collisions and rollback order. Timestamp collisions with app migrations are common; rename if artisan complains.RequestReceived / RequestTerminated as the package docs suggest.^1.0) and read the CHANGELOG before every minor — "minor" here means features only, but Laravel packages frequently ship behavior changes in config defaults.dd(config('package'), get_class(app(PackageContract::class))) distinguishes "misconfigured" from "wrong implementation bound" instantly, and those two failure modes account for most package issues.$this->app->bind() in your own provider), and events. If you find yourself extending a concrete class or reaching into protected properties, you are outside the supported surface and will feel it at the next minor release.config/logging.php for a package channel and confirm its level — silent failures are usually a channel swallowing debug-level messages.How can I help you explore Laravel packages today?