genj/faq-admin-bundle
Symfony bundle that adds a ready-made admin interface for managing FAQ entries, with CRUD, category organization, ordering, and publish controls so you can maintain help content without building custom backend screens.
Reality check before anything else: genj/faq-admin-bundle is a Symfony bundle, not a Laravel package. Its composer.json declares "type": "symfony-bundle", it ships a DependencyInjection/*Extension.php, and its admin screens are built on the Symfony admin stack of that era (typically SonataAdminBundle). There is no service provider, no config/faq-admin.php, no publishable views, and no Blade templates. composer require genj/faq-admin-bundle in a Laravel app will either fail on Symfony version constraints or drag in a pile of framework code you cannot boot. With 0 stars, 0 dependents, last release 2017-06-10, and the repo archived, there is no support path if it breaks.
So the only realistic "getting started" is as a specification to read, not a dependency to install.
composer.json — confirms the Symfony/Sonata/PHP version ceilings (expect PHP 5.x–7.x, Symfony 2.8/3.x).src/Genj/FaqAdminBundle/Admin/*Admin.php — the actual value. This file lists the FAQ fields, the list view columns, the filters, and the form widgets. This is your data model.Resources/config/doctrine/*.orm.yml (or entity annotations) — field names, nullability, lengths, relations to a category entity.Resources/config/admin.yml — how the admin service is wired; tells you what "managed" means here (CRUD + list filters + ordering).Schema::create('faqs', function (Blueprint $table) {
$table->id();
$table->foreignId('faq_category_id')->nullable()->constrained()->nullOnDelete();
$table->string('question');
$table->text('answer');
$table->string('slug')->unique();
$table->unsignedInteger('position')->default(0);
$table->boolean('is_published')->default(false);
$table->timestamps();
});
If you are actually maintaining a legacy Symfony 3 project rather than a Laravel one, the bundle is still a poor bet: the PHP and Sonata version pins will fight any modern runtime, and "archived" means no patch will ever arrive.
Pattern 1 — Port the admin UX, not the code. The bundle's *Admin.php class is effectively a config object. Read configureListFields, configureFormFields, configureDatagridFilters, and configureRoutes, then translate each one-for-one:
| Symfony Admin method | Laravel/Filament equivalent |
|---|---|
configureListFields |
table() columns |
configureFormFields |
form() schema |
configureDatagridFilters |
table()->filters() |
configureRoutes |
resource routes / policy |
The recurring feature set in Genj admin bundles is: category filter, published toggle, drag/position ordering, and a rich-text answer field. Reproduce those four and you have parity.
Pattern 2 — Category + FAQ as a two-resource admin. The bundle almost certainly pairs with a category entity. Model it as FaqCategory hasMany Faq, expose category as a BelongsTo select in the FAQ form, and add a Reorderable table column for position. Use a scopePublished() on the model so the front end never has to remember the flag:
public function scopePublished(Builder $q): Builder
{
return $q->where('is_published', true)->orderBy('position');
}
Pattern 3 — Translatable content, if the bundle used it. Older Genj bundles often leaned on a translation table or a2lix/translation-form-bundle. If the ORM mapping shows a faq_translation table, use spatie/laravel-translatable with a JSON question/answer column instead of a join table — simpler queries, same admin behavior.
Pattern 4 — Front-end consumption. The bundle only administers; rendering was your job then and is your job now. Cache the published list (Cache::remember('faqs.published', 3600, ...)) and bust it from the admin resource's afterSave/afterDelete hooks — an obvious win the 2017 bundle never offered.
Integration tips:
NOTICE file if you lift any PHP verbatim.Kernel::build(). Laravel never calls it. You will get an installed package with zero registered behavior — the worst possible failure mode, because composer require succeeds and nothing works.src/Genj/FaqAdminBundle/, which Composer 2 handles poorly), no security advisories, no Stack Overflow corpus. Any bug you hit is yours alone.bin/console debug:container | grep faq and confirm the bundle is registered in AppKernel.php. A missing registration is the #1 cause of "installed but invisible." In Laravel, there is nothing to debug — stop and re-scope.backpack/faq-style CRUD packages, Nova, or ~150 lines of hand-rolled controller + Blade. Any of these beats resurrecting a 2017 Symfony bundle inside a Laravel app.How can I help you explore Laravel packages today?