a SensioLabs Product

The PHP micro-framework
based on the Symfony Components

You are reading the documentation for Silex 1.3. Switch to the documentation for Silex 2.0.

Questions & Feedback

License

Creative Commons License Silex documentation is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License.

Internals

This chapter will tell you how Silex works internally.

Silex

Application

The application is the main interface to Silex. It implements Symfony's HttpKernelInterface, so you can pass a Request to the handle method and it will return a Response.

It extends the Pimple service container, allowing for flexibility on the outside as well as the inside. You could replace any service, and you are also able to read them.

The application makes strong use of the EventDispatcher to hook into the Symfony HttpKernel events. This allows fetching the Request, converting string responses into Response objects and handling Exceptions. We also use it to dispatch some custom events like before/after middlewares and errors.

Controller

The Symfony Route is actually quite powerful. Routes can be named, which allows for URL generation. They can also have requirements for the variable parts. In order to allow setting these through a nice interface, the match method (which is used by get, post, etc.) returns an instance of the Controller, which wraps a route.

ControllerCollection

One of the goals of exposing the RouteCollection was to make it mutable, so providers could add stuff to it. The challenge here is the fact that routes know nothing about their name. The name only has meaning in context of the RouteCollection and cannot be changed.

To solve this challenge we came up with a staging area for routes. The ControllerCollection holds the controllers until flush is called, at which point the routes are added to the RouteCollection. Also, the controllers are then frozen. This means that they can no longer be modified and will throw an Exception if you try to do so.

Unfortunately no good way for flushing implicitly could be found, which is why flushing is now always explicit. The Application will flush, but if you want to read the ControllerCollection before the request takes place, you will have to call flush yourself.

The Application provides a shortcut flush method for flushing the ControllerCollection.

Tip

Instead of creating an instance of RouteCollection yourself, use the $app['controllers_factory'] factory instead.

Symfony

Following Symfony components are used by Silex:

  • HttpFoundation: For Request and Response.
  • HttpKernel: Because we need a heart.
  • Routing: For matching defined routes.
  • EventDispatcher: For hooking into the HttpKernel.

For more information, check out the Symfony website.

Website powered by Symfony and Twig, deployed on
The Silex logo is © 2010-2017 SensioLabs