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

Shared Kernel Laravel Package

lin3s/shared-kernel

A lightweight PHP shared kernel offering reusable DDD building blocks such as value objects, identifiers, aggregates, domain events, and specifications for consistent modeling across bounded contexts.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • The package is positioned as a DDD-style shared kernel: reusable domain primitives, value objects, exceptions, or utility contracts shared across bounded contexts. That can fit a Laravel/PHP system only if the team deliberately wants an internal shared kernel and accepts the coupling that comes with it.
  • Health signals remain poor for a foundational dependency, though the picture is now slightly less one-sided than previously assessed. The project is not frozen at September 2018 — a v0.9.8 patch has since shipped — but a single late patch on a pre-1.0 package with 1 GitHub star and 0 dependents does not demonstrate the adoption, maintenance, or versioning discipline a shared kernel requires. It reads as a low-frequency compatibility band-aid, not renewed stewardship.
  • The v0.9.8 change ("made tactician event subscriber definitions public to avoid Symfony 4 issues") is architecturally informative and slightly worsens the fit assessment: it confirms the package ships container/service definitions wired for Symfony's DI, and depends on Tactician (a command-bus library that is itself effectively dormant). A shared kernel is supposed to be framework-agnostic; this one is demonstrably tied to an older Symfony container and a third-party bus.
  • The fix is a visibility workaround (private → public definitions) to dodge Symfony 4 container behavior. That is maintenance of the 2018-era integration, not modernization. There is no evidence in the release of PHP 8.x support, Laravel compatibility, or a modernization roadmap.
  • Best architectural use case is unchanged and now better supported by evidence: treat the package as reference code or a source of a small set of copied primitives, not as a long-lived Composer dependency in a new Laravel application.

Integration feasibility

  • Technically installable via Composer if its composer.json constraints allow the target PHP/Laravel version, but the 2018 origin plus a Symfony 4-targeted patch strongly suggests PHP 7.x-era constraints and incompatibility with modern Laravel 10/11 and PHP 8.2+ without changes.
  • The release confirms there is a service-container surface (service definitions for event subscribers), so "no framework wiring" can no longer be assumed. It is Symfony wiring rather than Laravel wiring, which is arguably worse for a Laravel target: it will not integrate with Laravel's container out of the box, and may conflict with it if bootstrapped manually.
  • Feasibility is medium for a spike or internal fork, low for production dependency adoption. The audit scope must now explicitly include the package's DI configuration files and its Tactician dependency, not just its PHP classes.
  • The patch itself is non-breaking for consumers: changing private to public service definitions does not alter the public PHP API. The risk is not the diff — it is what the diff reveals about the dependency's shape.

Technical risk

  • High abandonment risk: negligible community adoption, no visible dependents, and the only recent activity is a narrow Symfony 4 compatibility patch. Security and compatibility fixes should still be assumed not to arrive upstream on any predictable cadence.
  • High compatibility risk: old PHP constraints, likely deprecated syntax, and now a confirmed dependency on Tactician and Symfony DI conventions. Modern Laravel or other Composer packages may conflict transitively.
  • Pre-1.0 versioning risk: at 0.9.x there is no semver backward-compatibility guarantee. A future patch could change behavior legitimately; conversely, this patch shows the maintainers will touch container wiring without a major version bump.
  • High architectural risk: a shared kernel is intentionally coupled across contexts. Importing an unvetted external shared kernel can spread obsolete domain semantics and hidden assumptions across the codebase — and in this case also spreads an obsolete service-container idiom.
  • Supply-chain risk is moderate and slightly elevated versus the prior assessment because of the added Tactician transitive dependency, though the package and its dependency are both small and MIT-licensed. Vendor-copying or forking shifts risk to internal ownership rather than eliminating it.

Key questions

  • What exactly changed between the prior release and v0.9.8 — which files, which DI configuration format, and are the event subscriber definitions part of the package's public integration surface or purely internal wiring?
  • Where does the Symfony container wiring live, and can it be bypassed entirely so the PHP classes are usable standalone under Laravel?
  • Is Tactician a hard runtime dependency or dev/optional? If a service provider or command bus is expected, is that bus even viable in a Laravel app that already has its own queue and bus abstractions?
  • What PHP version and dependency constraints are declared, and does it install cleanly under the target Laravel/PHP matrix?
  • Does the package expose framework classes in its public signatures (base classes, container interfaces, bus interfaces), which would leak Symfony/Tactician types into domain code?
  • Is there meaningful test coverage, CI history, static analysis, and documentation, or only a code dump?
  • Who owns the fork if adopted, and what is the remediation plan for PHP 8.x, Tactician removal or replacement, and future Laravel upgrades?
  • Would copying the small set of needed primitives into an internal Shared namespace be cheaper and safer than taking a dependency? The v0.9.8 evidence tilts this toward "yes."

Integration Approach

Stack fit

  • Fit is conditional and now narrower. If the target stack is a modern Laravel application using DDD-style bounded contexts, the package's concept may fit, but the implementation is tied to Symfony 4 container definitions and Tactician, and is unlikely to fit without modernization or stripping.
  • If the application is a small CRUD Laravel app, a shared kernel package is unnecessary abstraction and the container wiring is pure liability.
  • If the team already follows LIN3S conventions or maintains an existing LIN3S codebase, the package may be contextually appropriate — and v0.9.8 is directly relevant to that scenario, since the patch exists to unblock Symfony 4. Otherwise, treat it as untrusted legacy code.
  • Laravel-native integration should be assumed to require dropping the package's container definitions entirely and registering only plain classes.

Migration path

  • Preferred path: audit the repository including its DI config and Tactician usage, extract only the primitives actually needed, and vendor them into an internal package or app/Shared namespace with internal tests and ownership. The v0.9.8 change should be reviewed as part of that extraction, since the definition-visibility workaround is not something to carry forward.
  • Fallback path: install the package pinned to the exact v0.9.8 release in a branch, wrap it behind internal interfaces, do not load its service definitions, and prevent its types from leaking across bounded contexts.
  • Avoid a broad migration where application code depends directly on the package's classes or its bus/container contracts. That creates a hard-to-reverse coupling to an unmaintained dependency.

Compatibility

  • Verify composer.json platform requirements, autoload standard, PHP extensions, and transitive dependencies — explicitly including Tactician — before any integration.
  • Diff the prior release against v0.9.8 and review the DI configuration files it touched; confirm whether any definition is consumed by the package's own bootstrapping or is purely internal.
  • Run the package's own tests under the target PHP version; if tests are absent or fail, do not adopt as-is.
  • Check for PHP 8.2+ deprecations, dynamic properties, outdated return types, and PHPUnit/tooling incompatibilities.
  • Confirm there is no namespace collision with Laravel or existing domain code, and no reliance on global state, Symfony container bootstrapping, or double-registration of service definitions.

Sequencing

  1. Source audit: inventory classes, DI configuration, Tactician usage, tests, and domain assumptions.
  2. Release diff review: compare v0.9.8 to the prior release and classify the change as internal wiring vs. contract change; confirm no consumer-facing impact.
  3. Compatibility spike: install in an isolated branch under the target PHP/Laravel versions, with and without loading the package's service definitions, and run tests/static analysis.
  4. Fitness review: decide whether each primitive belongs in an internal shared kernel or should be reimplemented.
  5. Internalization: copy/fork only the approved primitives, drop the Symfony/Tactician wiring, add ownership, tests, and documentation.
  6. Pilot integration: use in one bounded context behind internal interfaces.
  7. Expansion gate: only broaden usage after the pilot proves compatibility and maintainability.

Operational Impact

Maintenance

  • Upstream maintenance should be assumed to be near-zero and reactive. The v0.9.8 patch is a positive signal that the maintainers still respond to breakage, but it is a single narrow fix targeted at an old framework version, not a maintenance program.
  • A shared kernel has a high blast radius. Any defect or semantic change affects multiple contexts, so internal change control and versioning must be established before wide use.
  • The package's pre-1.0 version and its Symfony-facing surface make dependency-upgrade work likely on every Laravel or PHP major bump. Budget for periodic re-patching of the fork even if the upstream does nothing.

Support

  • Community support is effectively nonexistent: 1 star and 0 dependents mean no meaningful issue triage, Stack Overflow coverage, or third-party tutorials. The v0.9.8 release does not change this.
  • Support must be internal: an owner, escalation path, and documented fork policy are required.
  • If the package is used without a fork, the team cannot rely on upstream for CVE response, framework compatibility, or container-wiring fixes beyond whatever ad hoc patches happen to land.

Scaling

  • The code itself is unlikely to be a runtime scaling bottleneck; shared domain primitives are usually lightweight. The container definitions add a small bootstrap-time cost if loaded, which is another reason to omit them.
  • Organizational scaling is the real concern: a shared kernel increases coordination cost across teams. With an unmaintained external package, that cost is magnified because every team inherits the same legacy constraints and the same Symfony-era wiring idiom.
  • If many services or bounded contexts adopt it, the package becomes an implicit platform dependency without platform-level support.

Failure modes

  • Composer resolution failure or autoload conflict after a Laravel/PHP upgrade.
  • Container-definition conflict: manual registration of the package's service definitions alongside Laravel's container, or duplicate definition loading, causing boot errors or silently overridden bindings.
  • Abandoned transitive dependency: Tactician stops receiving fixes or conflicts with a modern bus/queue implementation.
  • Runtime deprecation or type errors under PHP 8.x.
  • Hidden coupling where domain code depends on package-specific exceptions, base classes, value-object semantics, or bus/container interfaces.
  • Semantic drift: the package's idea of a shared primitive diverges from current business rules, and teams patch locally in incompatible ways.
  • Fork fragmentation: multiple teams copy different versions, or some carry the Symfony wiring and some do not, creating inconsistent behavior across contexts.
  • Security or bug exposure with no upstream remediation path.

Ramp-up

  • Developer ramp-up is low for the PHP API surface if the package is small, but higher than before for the operational context: engineers must now also understand the DI definition model and why the package needs Symfony 4 container semantics, then learn why the internal fork drops it.
  • New team members must learn both the package's primitives and the internal fork's deviations, which is avoidable overhead for a low-adoption package whose only recent activity is a compatibility patch.
  • Recommended ramp-up is an audit spike with one senior PHP/Laravel engineer, including the v0.9.8 diff, followed by a written adopt/fork/reimplement decision. Do not onboard multiple teams until that decision is documented.
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.
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
noith/settings