Silex replacement
Edit on GitHubOriginally, Silex was used to integrate Symfony Components with Spryker using Service Providers. Also, there were other Service Providers added by Spryker and customer projects to bootstrap the application. Such providers implemented Symfony components and other entities by adding them to the Pimple container. Since Silex project is abandoned and the Pimple version is outdated, we replace them with a Spryker solution.
What did we replace?
We replaced silex/silex
and pimple/pimple
.
To be able to replace Silex, we removed all the dependencies in Spryker version 1.3.6
.
We added a new Spryker application to replace Silex and a container to replace Pimple.
Is Silex replacement backward compatible?
To avoid forcing an immediate update of the majority of modules, we introduced several small changes, which are backward compatible.
As Silex was an instance of Pimple with all services attached to, we introduced our own Container that implemented the ContainerInterface
from PSR-11. Additionally, we added a mock class for Pimple that further extended the Container. The mock class allows us to keep using the \Pimple;
USE
statement without the pimple/pimple
package. In this case, we don’t have to refactor the code that has Pimple dependencies and all the changes are backward compatible.
We moved the dependency to spryker/silex
to require-dev
in all Spryker modules.
When you update a module partially, you might have to add spryker/silex
to your root composer.json
.
What changed?
This section describes the changes caused by the Silex replacement.
Application plugins
Since ServiceProviderInterface
is not provided anymore, any code that implements it has to be migrated to the new model.
To provide a proper replacement for each Service Provider, we introduced Application plugins. An Application plugin is a plugin that integrates a service like Twig, Form, Security, or Routing into the application. Each plugin is added to the corresponding ApplicationDependencyProvider
.
If you use ServiceProviderInterface
, make sure to include spryker/silex
as a require
dependecy on the project level.
Extending services
Each service added as an Application plugin has an extension interface. To extend a service, use the extension interface of the respective service. For example, The Twig
module contains TwigApplicationPlugin
. The TwigExtension
module brings at least one interface that can be used to extend Twig. To extend it, add TwigApplicationPlugin
to ApplicationDependencyProvider
. To extend Twig further, add a plugin to TwigDependencyProvider
.
You can still extend services via Service providers.
Existing service providers
Existing Service Providers remain unchanged. New services are added as Application plugins.
Migrating away from Silex
Since the migration was implemented in two steps, the migration instructions for each project depend on when it was created. If the services in your project are implemented via Service Providers, start the migration from Replacing Silex. If one or more services are implemented as Application Plugins, start from Removing Silex.
Replacing Silex
To replace Silex, follow the instructions below,
Update modules using Composer
Update the following modules using Composer:
spryker/application
>=3.13.2
spryker/container
>=1.1.0
spryker/silex
>=2.1.0
spryker/symfony
>=3.2.2
spryker-shop/shop-application
>=1.4.1
The versions above are the minimum requirements. We recommend updating all the modules to the latest versions.
In older Spryker Commerce OS or Spryker Demoshop versions, there can be dependencies in the composer.json
. If your project is based on such a version, make sure that the mentioned modules do not appear as project dependencies, and that there are no constraint points to silex/silex
, spryker/pimple
, or pimple/pimple
.
An update might not contain the latest versions of the required modules. To find out why they are not installed, use the why
and why-not
Composer commands. They will help you to update the dependencies.
Update modules manually
We refactored the modules below to use Application plugins, and the update requires additional steps.
Update the following modules using the provided migration guides:
MODULE | MIGRATION GUIDE |
---|---|
ErrorHandler | Migration guide - ErrorHandler |
EventDispatcher | Migration guide - EventDispatcher |
Form | Upgrade the Form module |
Http | Migration guide - Http |
Locale | Migration guide - Locale |
Propel | Migration guide - Propel |
Messenger | Migration guide - Messenger |
Router | Upgrade the Router module |
Security | Migration guide -Security |
Session | Migration guide - Session |
Store | Migration guide - Store |
Translator | Migration guide - Translator |
Twig | Migration guide -Twig |
Validator | Migration guide - Validator |
WebProfiler | Migration guide - WebProfiler |
You’ve replaced Silex.
Removing Silex
To remove Silex:
- Update the modules from Make Silex optional.
- In
public/Glue/index.php
replacePyz\Glue\GlueApplication\Bootstrap\GlueBootstrap
withSpryker\Glue\GlueApplication\Bootstrap\GlueBootstrap
. - Add
Spryker\Shared\Http\Plugin\EventDispatcher\ResponseListenerEventDispatcherPlugin
to\Pyz\Glue\EventDispatcher\EventDispatcherDependencyProvider::getEventDispatcherPlugins()
. - Add
Spryker\Glue\Http\Plugin\Application\HttpApplicationPlugin
to\Pyz\Glue\GlueApplication\GlueApplicationDependencyProvider::getApplicationPlugins()
. - Remove the
Pimple
plugin everywhere. To access an Application service, use$container->getApplicationService('service id');
in theDependencyProvider
. Then, you can retrieve it within the modules Factory with$this->getProvidedDependency()
. - Add
Spryker\Shared\Http\Plugin\EventDispatcher\ResponseListenerEventDispatcherPlugin
to\Pyz\Yves\EventDispatcher\EventDispatcherDependencyProvider::getEventDispatcherPlugins()
. - Replace each
ServiceProvider
with the annotated replacement of theApplicationPlugins
defined in\Pyz\Yves\Console\ConsoleDependencyProvider::getServiceProviders()
and add theApplicationPlugins
to\Pyz\Yves\Console\ConsoleDependencyProvider::getApplicationPlugins()
. - Replace each
ServiceProvider
with the annotated replacement of theApplicationPlugins
defined in\Pyz\Yves\ShopApplication\YvesBootstrap::getServiceProviders()
and add theApplicationPlugins
to\Pyz\Yves\ShopApplication\ShopApplicationDependencyProvider::getApplicationPlugins()
.
You’ve removed Silex.
Thank you!
For submitting the form