paneedesign/api-bundle
A Laravel API bundle that packages common building blocks—routes, controllers, resources, and helpers—into one installable package, helping you scaffold and organize API endpoints faster with less boilerplate.
The first thing to understand is that despite the name reading like a generic API toolkit, paneedesign/api-bundle is a Symfony bundle, not a Laravel package. The -bundle suffix and the DependencyInjection/, Resources/config/ layout you'll find in the repo are Symfony conventions. There is no ServiceProvider, no config/api.php publish step, and nothing that hooks into Laravel's container out of the box.
Minimal steps:
composer.json first. Check the require block for symfony/framework-bundle, the PHP constraint, and the type field (symfony-bundle). This tells you immediately whether it can coexist with a Laravel app (almost certainly it cannot without a bridge).src/PaneedesignApiBundle.php, and the DI extension under DependencyInjection/. That extension is where configuration is parsed and services are registered — this is the real "API surface" of the package.Resources/config/ for services.yaml/services.xml to see what services are actually exposed and which are public vs. private.First use case: in a Symfony app, composer require paneedesign/api-bundle, register it in config/bundles.php (Paneedesign\ApiBundle\PaneedesignApiBundle::class => ['all' => true]), then configure it under config/packages/. In Laravel, your first concrete use case is more likely evaluating whether to use it at all — read the code, and if the core services depend on ContainerAwareInterface or Symfony events, treat it as a service to call over HTTP rather than a library to embed.
Given a 0-star, 0-dependent package, budget time to read the source before wiring anything, because there is no tutorial to lean on.
Direct Symfony usage. The conventional flow is: register the bundle, publish/author the YAML config under config/packages/paneedesign_api.yaml, and let the bundle's extension register tagged services. Inject those services into your controllers or commands via constructor autowiring. This is the intended path and the one least likely to surprise you.
Adapter/wrapper pattern (recommended for Laravel). Do not let this bundle's classes leak into your app. Define your own ApiClientInterface in Laravel and write a single PaneedesignApiAdapter implementation that talks to the Symfony side — ideally over HTTP, not by embedding Symfony's kernel. This keeps the blast radius small if the package is abandoned (and at 0 stars, that's a live concern).
Sidecar service. If the bundle provides actual API behavior you need, run it as a small Symfony app or container and have Laravel call it. You get version isolation, a clean process boundary, and you can drop the sidecar without touching your Laravel code. This is often the cheapest correct answer for a Symfony bundle in a Laravel shop.
Fork-and-pin. Because there are no dependents and no security advisories, treating it as a vendored internal fork is defensible. Fork, tighten composer.json constraints to your PHP/Symfony versions, and reference it via a VCS repository entry. Commit composer.lock and treat upgrades as manual reviews.
Config-driven integration. If the DI extension exposes config keys, drive behavior from config rather than subclassing bundle internals. Prefer the extension's documented options over overriding services in services.yaml — the latter breaks on minor version bumps.
Extension/Bundle classes. Any attempt to composer require it into a Laravel app and "just use it" will fail at the autoload/container step. Plan the bridge (sidecar or adapter) up front.ContainerAwareInterface and Symfony event usage. These are the two things that make classes impossible to reuse outside Symfony. If the "core" logic is entangled with the container, the sidecar approach is your only clean option.bin/console debug:container and debug:config paneedesign_api (or whatever the extension alias is) to confirm the bundle's extension actually parsed your config. Most "the bundle isn't doing anything" issues are a missing bundle registration or a config key under the wrong root.services.yaml directly — it survives composer updates.^ ranges, and have a documented exit plan (the adapter interface) so a replacement is a one-file change.composer.json has a license key before shipping it in a commercial product.How can I help you explore Laravel packages today?