genj/faq-bundle
A Symfony bundle for adding a managed FAQ section to your application. Includes categorized questions, admin controls, and ready-to-use entities, controllers, and templates for quick integration.
Architecture fit — none, unchanged. genj/faq-bundle v2.0.0 is still a Symfony 3 bundle: a GenjFaqBundle registration class, a DependencyInjection/ extension, YAML routing and service definitions, Doctrine ORM entities/repositories, and Twig templates. Nothing in the release moves it toward a framework-agnostic package. The new capabilities (scheduling fields, search, popular-query reporting) are implemented inside the same Symfony container/Doctrine/Twig assumptions. Laravel still has no bundle loader, and the bundle still assumes Symfony's kernel, event dispatcher, and container semantics. Embedding it remains an act of hosting a second framework, not an integration.
Integration feasibility — still zero without a fork, and the fork just got bigger. The three blockers from the original assessment all persist, and the release adds scope on top of them:
symfony/* ^6/^7 transitive requirements. Composer resolution still fails or forces a whole-application downgrade.publishAt/expiresAt, whether expiry soft-hides or 404s, whether scheduled content is cache-visible, what "very, very, very, very simple MySQL search" means at the query level, and what the query-log retention policy is.Technical risk — high and non-mitigable, with two new specific concerns.
LIKE '%term%' scans or an unindexed MATCH without relevance tuning. That does not scale past a small FAQ table and cannot be cached effectively because it is query-shaped by user input. If search matters to the product, this is a feature you would rebuild with a proper index (or Meilisearch/Scout) regardless of framework.isActive/publishAt/expiresAt semantics. For an archived package, "read the entity definitions and guess" is the migration guide.Key questions for the decision gate:
Overall assessment: the release adds features to a package that remains structurally unadoptable in a Laravel codebase. The composite score and opportunity signal should be discounted — any recency or activity bump from a v2.0.0 tag reflects a release event, not a change in fitness. This package should still be treated as a reference design and a requirements checklist, not a dependency. The most useful thing v2.0.0 provides is a free enumeration of the feature set we should build: active flag, publish/expiry scheduling, basic search, popular-query reporting.
Stack fit — incompatible by construction. Target stack is Laravel (PHP 8.x, Eloquent, Blade, Laravel's symfony/* ^6/^7 transitive dependencies). The bundle targets Symfony 3.2 / PHP 5.5.9+ / Doctrine ORM 2.x-era APIs, and the new release reaffirms rather than relaxes that pin. Composer will not install this alongside a current Laravel application without pinning the dependency graph backwards.
Migration path — extract the schema and the requirements, discard the code. Revised sequence:
isActive, publishAt, expiresAt, slug/locale fields, plus whatever table backs the popular-search-query log. Document the semantics you cannot infer from column names: timezone basis for scheduling, visibility rules for expired vs. inactive vs. future-dated items, and the exact search predicate.publish_at/expires_at and a faq_search_queries log table), Eloquent models with scopes for active(), published(), ordered(), scheduled-visibility composition, a thin controller or Filament/Nova resource for admin CRUD, Blade/Inertia components for the public render, and a cached read path.LIKE-based query behind a dedicated endpoint (acceptable at small corpus size) or Laravel Scout with a real engine. Do not port the bundle's query; re-specify it. Index or constrain the input regardless of choice.Compatibility — hard no at the dependency level. Do not add genj/faq-bundle to composer.json, not even as require-dev. The explicit Symfony 3.2 target makes resolver conflict more likely, not less. Vendor a read-only copy into docs/reference/ outside the autoload graph if the team wants to consult the entity definitions.
Sequencing. Spike → gate → schema freeze → parallel tracks: (a) admin CRUD with scheduling, (b) public render with visibility scopes. Search and query-analytics land after the schema is frozen and after the cache layer exists, because both touch the read path. Scheduling must be settled before caching is designed — a cache key that ignores publishAt/expiresAt will serve unpublished content.
Maintenance — full ownership either way, with more surface now. Adopting the bundle means owning a Symfony 3 fork forever, including PHP 8/9 compatibility, security patches for abandoned transitive dependencies, and a framework bridge — plus whatever maintenance the new scheduling and search code requires, which no upstream will provide. Rebuilding means owning a small Laravel module that looks like the rest of the codebase. Both are "you own it"; only one is legible to the team.
Support — none available. No maintainer, no issue triage, no documentation beyond the README and a terse release note, 0 dependents. The v2.0.0 notes are four bullets; they do not specify timezone handling, migration steps, or search behavior. Any incident is first-principles debugging inside unfamiliar framework conventions.
Scaling — the read side is fine; the new write side is not. FAQ traffic remains read-heavy and cache-friendly, and a rebuilt module behind Laravel's response cache or Redis handles it trivially. Two new caveats specific to this release:
LIKE '%term%' scan over the FAQ table is a full scan per unique query, and the query space is unbounded. At small scale this is invisible; at moderate scale it is the slowest endpoint in the app. Mitigate with a real index or a short-TTL result cache keyed by normalized term.Failure modes to plan for:
composer update, blocking unrelated work.Ramp-up. A Laravel engineer needs hours to rebuild the base FAQ and roughly a day more for scheduling plus a search endpoint; days-to-weeks to become productive inside a Symfony 3 bundle plus bridge. The ramp-up curve remains inverted relative to the delivered value, and v2.0.0 widens the gap.
Recommendation: do not adopt; update the rebuild scope. Use the v2.0.0 feature list as the acceptance criteria for a native build — active flag, publish/expiry scheduling, search, and popular-query reporting — and budget 3–6 engineer-days instead of 2–4. Keep the dependency graph clean. The only scenario that changes this is a hard requirement to run the existing Symfony 3 code as-is, in which case the correct move is to contain it as a separate service behind an HTTP boundary, not to integrate it into Laravel.
How can I help you explore Laravel packages today?