Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Core Bundle Laravel Package

symfonyid/core-bundle

A core bundle for Symfony/PHP applications that bundles shared foundations—common services, configuration defaults, and reusable components—to help you bootstrap and standardize projects quickly.

View on GitHub
Deep Wiki
Context7

Getting Started

symfonyid/core-bundle is a Symfony bundle, not a Laravel package. That single fact shapes every step below. A composer require symfonyid/core-bundle inside a Laravel app will not register anything: there is no Bundle class loader, no config/bundles.php, no service container extension being invoked. If your target codebase is Laravel, "getting started" means reading and porting, not installing.

Do these in order, before writing app code:

  1. Read composer.json first. Look for "type": "symfony-bundle", the require block (PHP constraint, symfony/framework-bundle, symfony/dependency-injection versions), autoload.psr-4 namespace, and a license field. Zero stars plus a missing license is a legal blocker, not a style nit. Do not proceed past this step until the license is resolved.
  2. Find the bundle entry point. It will be a class extending Symfony\Component\HttpKernel\Bundle\Bundle under src/ (e.g. SymfonyId\CoreBundle\SymfonyIdCoreBundle). If it does not exist, the repo is not a functional bundle and the evaluation is over.
  3. Open DependencyInjection/. The *Extension class defines the config tree and which services are registered. The presence or absence of Configuration.php tells you whether there is a user-facing config surface or whether services are hardcoded.
  4. Inspect Resources/config/ or config/. Note whether services use autowire/autoconfigure (overridable) or hardcoded service ids (you must use decorate or id-based overrides). Check for CompilerPass classes — these are the migration landmines later.
  5. Look for tests/ and a CHANGELOG/tags. With 0 dependents, absence is the default. Presence of even a few tests is a meaningful positive.

Your first real use case is a scratch Symfony app matching your target runtime, not your Laravel app:

composer require symfonyid/core-bundle:@dev --prefer-source
bin/console debug:container --env=dev | grep -i symfonyid
bin/console debug:container --env=dev --tag=container.service_subscriber
bin/console lint:container

What you find there is almost always one of: string/slug formatters, base controllers, form types, Doctrine helpers, response builders, or a config-convention scaffold. Pick the single subsystem that overlaps a real problem you have and ignore the rest. "Toolkit for various project needs" is a grab-bag, and grab-bags are adopted wholesale by mistake.

Implementation Patterns

Path A — Symfony project (conditional, behind a facade)

If the evaluation confirms license, PHP/Symfony fit, and at least a handful of utilities you would otherwise hand-roll, adopt it — but pin and wrap.

Pin to an immutable commit, never a branch or a floating constraint. With 0 dependents and no tags, ^1.0 is unenforceable:

"repositories": [
  { "type": "vcs", "url": "https://github.com/SymfonyId/CoreBundle" }
],
"require": {
  "symfonyid/core-bundle": "dev-master#<full-sha>"
}

Register in config/bundles.php behind a feature flag if the bundle is optional:

SymfonyId\CoreBundle\SymfonyIdCoreBundle::class => ['dev' => true, 'test' => true, 'prod' => true],

Wrap behind an internal facade. No application code should reference SymfonyId\* service ids directly — otherwise an upstream rename becomes a grep across your codebase. Define your own interface and either inject the bundle's service or delegate:

// src/Support/SluggerInterface.php  (your namespace)
interface SluggerInterface { public function slug(string $value): string; }

// config/services.yaml
App\Support\SluggerInterface:
    alias: SymfonyId\CoreBundle\Util\Slugger  # adjust to actual id

This gives you a one-file swap if you later fork or reimplement, and it caps the blast radius of an unmapped upstream change.

Override, don't edit. For a hardcoded service id, use decoration rather than replacement so upstream wiring still resolves:

App\Support\DecoratingSlugger:
    decorates: SymfonyId\CoreBundle\Util\Slugger
    arguments: ['@.inner']

Add contract tests that exercise the services you use. They fail loudly on upstream drift instead of silently changing behaviour at a container rebuild:

public function testSluggerContract(): void
{
    self::assertSame('hello-world', $this->get(SluggerInterface::class)->slug('Hello World'));
}

Path B — Laravel project (port, do not install)

Laravel's ContainerAwareInterface equivalent, its ServiceProvider, and its config repository are a different model. Bundles do not exist. The realistic day-to-day pattern is:

  1. Identify the 2–5 classes you actually need from src/.
  2. Copy them into app/Support/ (or packages/acme/support/) with your own namespace and a LICENSE header noting the origin.
  3. Strip any Bundle subclass, Extension, CompilerPass, and Resources/config/* files — you have no framework to serve them to.
  4. Bind them as singletons in a service provider:
public function register(): void
{
    $this->app->singleton(SluggerInterface::class, function () {
        return new \Acme\Support\Slugger();
    });
}
  1. Replace any Symfony-injected dependencies (RequestStack, TranslatorInterface, EventDispatcherInterface) with Laravel equivalents (Illuminate\Http\Request, __(), Event::dispatcher()), or drop them if unused.

Only port utilities that are pure PHP with no Symfony service dependency. Anything touching the container, event dispatch, or HTTP kernel is a rewrite, not a port — do not take those on speculatively.

Path C — internal reusable toolkit (the honest long-term play)

The assessment’s own signal — an opportunity score with zero adoption — reads more like "nobody has built the thing" than "this is the thing." The pattern that ages best is treating this repository as a reference implementation for your own acme/support package:

  • Vendor the utilities you keep, under your namespace, with your tests and your license.
  • Publish internally via a private Composer repository or a path repository.
  • Treat upstream as inspiration, not a source of truth — you will not be getting patches anyway.

Gotchas and Tips

Framework mismatch is the first trap. Every Symfony-only concern here — SymfonyIdCoreBundle::class, Extension::load(), prependExtension, compiler passes, service tagging — is inert in Laravel. If someone on the team proposes installing it in a Laravel app because "it's PHP," they have not read composer.json. Redirect them to Path B.

No tags, no semver, no branches to trust. Pin to a full commit SHA in composer.json. Never dev-master, never ^1.0. If it breaks, you want the failure to be attributable to a specific SHA, not to whatever was pushed this morning.

Compiler passes are upgrade blockers. A CompilerPass that runs on ContainerBuilder is the usual reason a low-traffic bundle stops booting on the next Symfony major (7.x→8.x-era deprecations, Definition API changes, tag changes). Grep src/ for class .*CompilerPass and decide up front whether that behaviour is load-bearing for you. If it is not, delete the pass during the port — this is the single biggest reduction in maintenance surface you can make.

Deprecated Symfony APIs are common in low-traction bundles. Watch for ContainerAwareInterface / ContainerAwareTrait, getDefaultOptions() on form types (removed in favour of configureOptions), SwiftMailer-era mailer wiring, and @Route annotation syntax. Run PHPStan at your baseline and bin/console lint:container before committing. composer why-not will not save you here because there is nobody to file a bug against.

Service id collisions. A toolkit that registers generic ids (app.helper, core.dispatcher) will collide with your own. Prefix anything you keep; prefer decorate over replace for anything already wired.

Debugging in Symfony. debug:container --show-private to see what actually resolves. debug:container --deprecations to surface version skew. lint:container and d lint:yaml config/ for config-tree errors. debug:config symfony_id_core (adjust to actual alias from the Extension::getAlias()) to see the merged config tree — if there is no alias, there is no config tree, which simplifies overrides considerably.

Resources path. Check whether the repo uses Resources/config/ (Symfony ≤4 convention) or config/ (Symfony ≥5). If it is the older layout and you are on a modern Symfony, expect to move the files or override the Extension::getPath() yourself.

No issue triage, no security policy, no release cadence. Do not put this on a code path that touches auth, payments, or data access. Edge-of-the-app utilities only. If the code you keep is under a few hundred lines, the fork decision is already made — own it.

False confidence from the opportunity score. A high opportunity score alongside 0 stars/0 dependents is a demand signal, not a quality signal. Do not let it appear in a design doc as justification for adopting this repository. If it appears, it should be as justification for building an internal equivalent.

Assume you become the maintainer. Write a one-page internal README at the point of forking: what you kept, what you dropped, why, and who owns it. That document is the mitigation for the bus-factor loss on the one engineer who read the source. Keep it current, because there will be no upstream changelog to read six months from now.

If it does not survive the Day-1 checks (no license, no bundle entry point, does not boot on a supported Symfony LTS), close the evaluation. Do not spend a week trying to make a zero-adopter bundle fit — the replacement cost for a handful of utility classes is measured in hours, not days.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
jinas/dhivatar
store-doc/laravel-storage-driver
plus-it/laravel-translation-manager
diephp/perhaps
diephp/telegraph
osmaviation/spreadsheet
microsoft/fluentui-system-icons
mmccook/php-json-canonicalization-scheme
middlewares/firewall
qubiqx/montapacking
nyoncode/laravel-package-console
pnscripts/filament-broadquill-lite
pnscripts/laravel-sentfold-lite
vleap/mx-sdk-laravel-internal
twidpay/utils
htetmyathlaing/scout-elasticsearch-driver
artisan-toolbox/front-awesome
ls/client-assistant
users-au/laravel-client
cgv/localized-resource