giudicelli/symfony-distributed-architecture-admin
Symfony bundle offering a centralized admin interface for distributed architectures. Manage services, nodes, and components from one place, with Symfony integration to simplify monitoring, configuration, control, and day-to-day operations across distributed systems.
Read this first: it is not a Laravel package. giudicelli/symfony-distributed-architecture-admin is a Symfony-oriented repository (bundle/app skeleton for administering a distributed/microservice architecture). It will not be auto-discovered by Laravel, it does not ship a LaravelServiceProvider, and its runtime assumptions (Symfony Kernel, DI container, routing/security config, possibly Messenger) do not map onto Laravel's container or HTTP kernel. Composer may install it, but "install" is not "integrate."
Minimal steps for a Laravel developer:
composer require. Open the repo and read, in this order:
composer.json — type (symfony-bundle, project, or library?), require (Symfony major version, PHP constraint), autoload PSR-4 roots.README.md — is this a reusable bundle or a demo/seed app?src/ and config/ — is there a DependencyInjection/*Extension.php, a *Bundle.php, routing YAML, security config?tests/ — presence/absence tells you how much you can trust behavior.If you are on a mixed stack and actually run Symfony somewhere, the first real step is: register the bundle in config/bundles.php, import its routing, and confirm the DI extension loads — in that order.
Pattern 1 — Pattern extraction, not dependency. Treat the repo as a specification. For each concern it addresses (service registry, cross-service health checks, admin authz, command/query fan-out), re-implement idiomatically in Laravel:
bind/singleton + config files.routes/*.php, Route::prefix('admin')->middleware([...]).dispatch, Bus::batch) or an HTTP client to the owning service.Pattern 2 — Sidecar with a thin client. If the repo is a runnable Symfony app:
// config/services.php
'service_admin' => [
'base_url' => env('SERVICE_ADMIN_URL'),
'token' => env('SERVICE_ADMIN_TOKEN'),
'timeout' => 5,
],
// A small, boring client — one class, explicit endpoints
final class ServiceAdminClient
{
public function __construct(private readonly Http $http) {}
public function services(): array
{
return $this->http->baseUrl(config('services.service_admin.base_url'))
->withToken(config('services.service_admin.token'))
->acceptJson()
->timeout(config('services.service_admin.timeout'))
->get('/api/services')
->throw()
->json('data', []);
}
}
Wrap it behind an interface, cache the read endpoints (Cache::remember(..., 15)), and never let admin-panel latency become your app's latency.
Pattern 3 — Contract-first integration. Whatever the repo exposes, write a Laravel-side DTO + validation layer for the responses. Do not pass raw arrays into views. Distributed admin surfaces rot fast when the upstream schema shifts silently; a DTO gives you one place to break.
Pattern 4 — Degrade, don't fail. Every panel widget should be independently timeout-guarded and independently failing. One dead microservice must render an error card, not a 500 on the whole admin page. Use Http::pool or concurrent requests if the panel fans out to many services.
Pattern 5 — Auth boundary. Admin endpoints are privileged. If you consume a sidecar, the token belongs in config/services.php + .env, never in a controller. If you re-implement, gate everything behind a dedicated admin middleware group and an explicit permission (Gate::define('admin.view-services', ...)).
composer require into a Laravel app casually. Composer will happily add Symfony packages; the breakage appears later when autoloaded classes reference a Symfony container or an interface Laravel doesn't implement. Install in a throwaway directory first and inspect the tree with composer show --tree.composer.json has "type": "project", it is not installable as a library at all — it is a seed app to be cloned. Check type before require.type: symfony-bundle does not mean "Laravel compatible." Symfony's Flex recipe auto-configuration is invisible to Laravel; nothing registers itself.src/ matches the README's claims; a one-file repo behind that title is a red flag.bin/console. No debug:container, no debug:router. Your debugging surface is composer.json, autoload, and static reading. grep -rn "class .*Bundle" and grep -rn "Extension" map the wiring quickly.Http::timeout(5) and add a per-widget circuit breaker (Cache::put("svc:{$name}:down", true, 30)).How can I help you explore Laravel packages today?