majora/framework-extra-bundle
A Symfony bundle from Majora that adds extra framework integrations and conveniences for PHP applications. It helps streamline common setup tasks and reusable functionality, reducing boilerplate when extending your project.
First, calibrate expectations: this is a Symfony bundle, not a Laravel package. It does not ship a ServiceProvider, does not support package auto-discovery, and cannot be composer required into a Laravel app and "just work." Stars (5) and archived: yes tell you the real story: this is a reference/legacy codebase, not a dependency. Treat it as source material to read and copy from, not something to install.
Minimal steps for a Laravel developer:
composer.json first — the require block tells you which Symfony versions it targets, and therefore which PHP features and API shapes you're looking at. An archived bundle is almost certainly pinned to Symfony 3/4-era conventions.DependencyInjection/ — the *Extension class and Configuration.php (this is the authoritative list of config knobs).Resources/config/ — services.xml/services.yaml, where the actual object graph lives.src/ (or the PSR-4 root) — the "extra classes": typically base controllers, base repositories/entity managers, form types, or traits.Tests/ — the best documentation of intended behavior.app/Support/. For example, a Symfony Controller subclass with convenience helpers becomes an app/Http/Controllers/BaseController.php; an EntityRepository base becomes a app/Repositories/BaseRepository.php wrapping Eloquent; Symfony AbstractType form classes become FormRequest + a Form/DTO mapper. Copy the shape, replace the framework calls.If you genuinely are in a Symfony app and want to use it as-is: register it in config/bundles.php, then inspect bin/console debug:config <alias> to see the merged configuration tree.
Pattern 1 — Fork-and-vendor (recommended). Do not add an archived dependency. Copy the specific classes you want into your own namespace, strip the Symfony-only imports, and write tests around the behavior you actually rely on. Attribution is cheap; supply-chain risk from an unmaintained bundle is not.
Pattern 2 — Concept translation to Laravel. The recurring idioms in bundles of this type map cleanly:
| Symfony bundle artifact | Laravel equivalent |
|---|---|
Bundle + Extension class |
Package ServiceProvider (register / boot) |
Resources/config/services.yaml |
Container bindings / singletons() |
Config tree in Configuration.php |
config/<name>.php + mergeConfigFrom |
Base Controller with helpers |
abstract class BaseController |
Base EntityRepository |
Base repository class around Eloquent / query builder |
AbstractType form classes |
FormRequest + DTO hydrator |
| Compiler passes / service tags | Container tagged() bindings, Resolving callbacks |
Pattern 3 — Convention layer. If you lift the base classes wholesale, adopt their conventions consistently (naming, protected helper methods, return types). The value of a bundle like this is uniformity; a half-adopted convention layer is worse than none.
Pattern 4 — If using it in Symfony for real. Extend the provided base classes rather than composing around them, override only what the extension explicitly documents, and lean on the bundle's own Tests/ as an executable spec for edge cases. Keep a thin local subclass layer (App\Controller\BaseController extends Majora\Controller\...) so a future replacement is a one-file change.
Pattern 5 — Integration via decoration, not modification. Where the bundle registers services, prefer Symfony's service decoration or a compiler pass in your bundle over editing vendor code. On the Laravel side, the analogue is $app->extend() / $app->bind() with a subclass.
composer.json constraints against your runtime. Composer will happily resolve old constraints and leave you on an unsupported stack.Laravel\...\ServiceProvider, no extra.laravel block in composer.json, no auto-discovery. Any attempt to composer require it into a Laravel app produces a package that is simply never loaded.bin/console debug:config <alias> rather than guessing the YAML root key. The Configuration.php tree is the ground truth for defaults.load() ordering matters. If configuration values appear ignored, the issue is usually that services are defined in Resources/config/ before the extension has pushed parameters in — or the parameter name changed between versions.debug:container --show-private to confirm services exist, debug:config for merged config, debug:router for anything route-related, then cache:clear — a stale container is the #1 cause of "my override does nothing."declare(strict_types=1) and convert Symfony exceptions (NotFoundHttpException, AccessDeniedHttpException) to Laravel ones, or you'll get confusing 500s from code that "worked" in Symfony.Resources/views naming conventions. Do not patch vendor/ — with an archived package there is no upstream to send fixes to and no release to re-pull.How can I help you explore Laravel packages today?