New in Symfony 3.4: Deprecated bundle inheritance
September 28, 2017 • Published by Javier Eguiluz
Warning: This post is about an unsupported Symfony version. Some of this information may be out of date. Read the most recent Symfony Docs.
One of the biggest changes of the upcoming Symfony 4 version is the removal of
bundles to manage the application code. Bundles will still exist as third-party
plugins installed in vendor/
, but your own code will live by default in the
src/
directory and it will use plain PHP namespaces instead of bundles.
In Symfony 3.4 we worked towards simplifying bundles even more. That's why we deprecated bundle inheritance and we'll remove it in Symfony 4.0. This inheritance mechanism was traditionally used to override some templates, controllers and other elements of third-party bundles. In Symfony 4.0 you'll need to use alternative solutions to override those elements:
- Controllers: define a route with the same path as the controller you want to override and implement your own logic.
- Templates: use the common template overriding mechanism with the traditional
app/Resources/<BundleName>/views/<templateName>.html.twig
dir or the newtemplates/bundles/<BundleName>/<templateName>.html.twig
dir on Symfony 3.4 and higher; you can also use Twig namespaces to define new templates under the same namespace as the bundle you want to customize. - Routing: don't load the bundle routes or apply the same technique as controllers.
- Services and Configuration: use compiler passes or service decoration.
- Entities: not possible unless the bundle provides a mapped superclass.
- Forms: use form extensions.
- Validation: not possible unless the bundle provides validation groups.
- Translations: not related to bundle inheritance; just override the right translation domain.
Help the Symfony project!
As with any Open-Source project, contributing code or documentation is the most common way to help, but we also have a wide range of sponsoring opportunities.
Comments are closed.
To ensure that comments stay relevant, they are closed for old posts.
The only actual changes are for routing (where just redefining the route was always possible), templates (where overriding the template without using a child bundle always worked too) and controllers.
And if I want to create a third party bundle that will be installed under `/vendor` how can I do this ?
About third-party bundles, nothing changes. You can still create those bundles and they are still installed in vendor/ In fact, a possible solution for your current in-app bundles is to turn them into private third-party bundles and install them in your application.
https://github.com/cwd/cwdStandardEdition/blob/develop/composer.json#L15
This is a Symfony 3.3.* Skeleton with the Symfony 4 Directory Structure without Flex. (mainly for my own use - and to quicken the bootstrap of certain apps)
I planned to develop large web application based on symfony 4 ... Application will grow by adding/removing/composing features via private bundles.
So we need SensioBundleGenerator command to boost our development ... But It seem they are removed from symfony 4 support tools.
But still, internal bundles are not deprecated, although not recommended in symfony 4 !?
Is flex the new tool concerned by internal private bundles management ? and when will bundles creation be available for developers ?
Regards.