gandung/shopee-php-sdk-bundle
A Laravel bundle that wraps the Shopee PHP SDK, providing a service provider, config, and facade for quick setup. Authenticate and call Shopee API endpoints for shops, orders, products, and logistics without wiring the SDK by hand in your application.
The 1.0.0 tag is explicitly labelled "Early release," so the first job is discovering what the package actually does rather than assuming an API. Read in this order:
README.md — the only reliable statement of intended use at this version.composer.json — check the extra.laravel.providers and extra.laravel.aliases keys. If they are absent, the package does not support auto-discovery and you must register the provider manually in bootstrap/providers.php (Laravel 11+) or config/app.php (Laravel 10 and below).src/ — locate the service provider first; its register() and boot() methods tell you what is bound into the container, what is publishable, and what hooks exist.config/ — if a config file ships, that is your de facto feature list.tests/ — at an early release, the test suite is the most accurate documentation of supported behaviour.Install and expose the package's surface:
composer require vendor/package:^1.0
php artisan vendor:publish --provider="Vendor\Package\PackageServiceProvider"
php artisan config:clear
Then verify the wiring before writing feature code:
php artisan about # confirms the provider booted without error
php artisan tinker --execute="dump(app(Vendor\Package\Client::class));"
First use case: take the single most obvious operation from the README, exercise it in a throwaway Tinker session or a single Pest/PHPUnit test, and confirm it round-trips. Do this before designing anything around the package — at 1.0.0 the documented behaviour and the actual behaviour are the most likely things to diverge, and you want that discovery to cost you ten minutes, not a refactor.
Resolve from the container, don't new it up. Anything the provider registers may carry config, HTTP clients, or logger dependencies. Constructor-inject the package's classes (or the contract it binds, if one exists) and let Laravel assemble them:
final class SyncOrders
{
public function __construct(private readonly \Vendor\Package\Client $client) {}
public function __invoke(Order $order): void
{
$this->client->push($order->toArray());
}
}
Wrap the package behind your own interface. This is the single highest-value pattern for an early-release dependency. Define an application-level contract, implement it with the package, and bind it in your own service provider. When 1.1.0 renames a method — likely, at this maturity — you edit one adapter class instead of grepping the codebase.
Drive behaviour through config, not code. Publish the config file and commit it. Read values with config('package.key') in your application code, never env() — see the gotchas below. Where the package exposes a config toggle for a feature, prefer flipping that over branching in your own code; it keeps the upgrade path clean.
Isolate side effects at the boundary. If the package dispatches events, hits the network, or writes to storage, call it from a queued job or a dedicated action class rather than inline in a controller. Early releases frequently change exception types and timeout handling; having a single choke point makes those changes survivable and gives you an obvious place to add retries and logging.
Test with the package's own fakes if they exist, otherwise bind a stub in the container during tests:
$this->app->bind(OrderPusher::class, fn () => new FakeOrderPusher());
Check src/ for a Testing/ directory or a fake()/swap() helper before hand-rolling one — many Laravel packages ship them, and using the upstream fake keeps your tests honest when the package's internals change.
"vendor/package": "1.0.*" rather than carets until you have read a changelog or two, and commit composer.lock.composer diff against the previous tag, or read the git history between tags) before upgrading. Absence of a CHANGELOG.md in an early release is itself a risk signal worth noting in your PR description.config:cache breaks env() calls in package config files. If the shipped config references env() and you cache config in production, values silently become null. Always re-publish or manually merge config after upgrading, and never rely on the package's config defaults being current.dont-discover block in composer.json will skip the provider. If classes are "not found" or bindings are missing, run php artisan package:discover and confirm the provider is listed under php artisan about.vendor:publish will not overwrite by default. If an upgrade adds config keys, your existing published file stays stale and the new keys fall back to package defaults — which may or may not be what you want. Re-publish with --force into a scratch directory, diff, then merge by hand.register(); if it is singleton() and holds per-request data, that is a bug worth reporting upstream.DeferrableProvider, provides() must list every binding. A missing entry produces confusing "target not instantiable" errors that only appear on the first resolution in a request — check there first when a binding works in Tinker but fails in a request.php artisan about for boot status, app()->bound(Class::class) to confirm the binding, and wrapping the failing call in try/catch with report() to surface the real exception (early releases often catch and re-throw a generic message, hiding the cause).Macroable trait, or event dispatch around the main operation. At 1.0.0 these are usually the only sanctioned customisation hooks; anything else means a fork you will have to maintain.How can I help you explore Laravel packages today?