graham-campbell/cms-core
Core package for Graham Campbell's Laravel-based CMS, providing the foundational services, base classes, and shared utilities that power the CMS and its companion packages.
Architecture fit. graham-campbell/cms-core is a small, coherent slice of CMS foundation work: a shared content-model trait (slugs, publishing state, metadata), navigation/menu management, persisted redirect handling, a caching layer in front of content delivery, and standard Laravel service-provider plus facade wiring. As a reference architecture it maps cleanly onto backlog epics a TPM will recognize — content modeling, navigation, URL churn / SEO redirects, delivery caching. As an actual substrate, its architecture fit is confined to one lineage: Bootstrap CMS-style applications on Laravel 4.1. The release note is definitive — "Support only laravel 4.1" — and the repo now lives under a GrahamDeprecated namespace at v0.2.0-alpha with zero dependents. That combination means this cannot anchor a roadmap item, a delivery estimate, or a customer-facing commitment. It can, however, anchor a requirements conversation and a written "no."
Integration feasibility. Feasible in exactly one mode: an existing Laravel 4.1 application that already depends on it. The realistic engagement options are read (mine the source and docs for domain shape — the highest-value option for a TPM), fork (take ownership of a pinned copy so we control the exit), or vendor (pin the exact alpha). composer require in a modern Laravel app is not a viable path, and an adapter layer to Laravel 5+ would cost more and carry more risk than reimplementing the three or four primitives it offers. One signal should drive the confidence rating directly: v0.2.0-alpha introduced PSR-4 autoloading while changing authentication, events, and models and removed its broken tests. Three high-coupling surfaces moved in the same release in which visible coverage went down. Any estimate built on this package should carry a large explicit unknown for undocumented contracts and unpublished schema expectations.
Technical risk. High, and mostly inherited rather than package-specific. The dominant risk is the end-of-life framework underneath — there is no security patch path for Laravel 4.1 regardless of this package's own code quality, so it will not clear a security review or dependency due-diligence gate. Layered on top: alpha versioning with no backward-compatibility promise; test coverage deleted precisely where auth and events changed; menus and redirects as customer-visible surfaces where defects are externally observable; and a caching layer that converts staleness into silent wrong behavior rather than a loud failure. Zero dependents means no field validation, no community triage, and no evidence these code paths have ever run at scale. The TPM-relevant framing: every risk here is unhedgeable upstream — it must be absorbed internally or avoided entirely.
Key questions.
v0.2.0-alpha, and what is current coverage on auth, events, and models?Stack fit. Narrow and non-negotiable: Laravel 4.1, PHP 5.x, Eloquent, Composer with the newly introduced PSR-4 autoloading. Fit is strong for a Bootstrap CMS-derived application and poor everywhere else. Rule out a Laravel 5+ bridge up front — guards, contracts, provider registration, config namespacing, and routing all diverge, so an adapter costs more and carries more risk than rebuilding the content trait, menus, and redirects on a supported version. For a TPM this is the decision that closes the evaluation: the package is a reference implementation, not a dependency candidate.
Migration path. Treat it as a legacy island with a defined, enforced boundary, and plan the exit on day one rather than after the first incident. Short term: pin and vendor (or fork) the exact 0.2.0-alpha, and hide every touchpoint behind internal interfaces — a content repository, a menu service, a redirect resolver — so no controller, view, or job references package classes directly. Long term: use the package as a behavioral specification and reimplement its three or four primitives on a supported Laravel version during the platform migration. Set an explicit modernization gate in the plan: no new feature work may depend on package internals, and no roadmap commitment or customer date may assume an upstream fix, because none will arrive.
Compatibility. Pin the exact version string — no caret, no floating constraint — and run a Composer dry run in a throwaway branch before touching application code. Verify the package's require/conflict blocks against our PHP and Laravel versions, confirm the PSR-4 namespace registers into vendor/composer/autoload_psr4.php, and check facade alias collisions against existing aliases in app/config/app.php. Config publishing follows 4.1's config:publish syntax, and config:cache behavior must be understood before anyone edits package config and expects it to take effect. Confirm archival status and license before the decision is finalized, not after.
Sequencing.
Maintenance. Effectively zero upstream and full internal ownership on day one. There is no maintainer, no release cadence, no patch stream, and no issue triage. Any bug is ours to fix, any incompatibility is ours to absorb, and any fork becomes a standing maintenance line item that needs an owner and a budget. Plan for the fork (if taken) to be treated as a first-class internal dependency with its own review cadence, not as a vendored third-party library that quietly ages.
Support. No support contract exists and none can be purchased. Incidents route to the internal owner — meaning on-call load, escalation paths, and a runbook must be defined before adoption, not after. Because the framework beneath it is also EOL, an internal owner inherits security response for both the package and Laravel 4.1 simultaneously. For stakeholders, the honest framing is that "support" here means "we are the support."
Scaling. Not a meaningful axis for this package — it was never validated at scale. Zero dependents means no public evidence of production load, and the caching layer's driver, TTL, and invalidation semantics are undocumented in the source material provided. Where content delivery, menu rendering, or redirect resolution sit on a hot path, cache staleness risk grows with editorial velocity: the more frequently content changes, the more likely a stale menu or redirect is served. Capacity planning should assume we own the performance characteristics entirely and must measure them ourselves.
Failure modes. The classic ones are worth naming in the runbook because they fail silently: event listeners not firing after the auth/event rework, so downstream side effects quietly stop; stale cache serving the wrong menu or redirect after an editorial change, which is user-visible and SEO-damaging rather than error-generating; config:cache freezing package config so edits appear ignored and confuse responders; redirect tables without loop detection producing infinite redirects; and, given the removed tests, regressions in login/logout and model persistence that no existing suite will catch. Our own end-to-end tests around auth flows, event firing, and model persistence become the only safety net.
Ramp-up. Low technical ramp-up, high contextual ramp-up. Legacy PHP and Laravel 4.1 idioms are well understood by most engineers, so reading the code is fast. The cost is orientation: undocumented contracts, inferred schema expectations, and no design rationale mean an engineer must reconstruct intent from source. Budget a short, time-boxed spike — days, not sprints — to produce the behavioral spec, and recognize that the spec, not the code, is the durable deliverable. Stakeholders should hear that clearly: the value extracted here is a requirements checklist and a documented "do not adopt," which together are cheaper than the alternative of rediscovering navigation and redirect gaps after content gets reorganized and links break.
How can I help you explore Laravel packages today?