This chapter will tell you how Silex works internally.
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.
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
post, etc.) returns an instance of the
wraps a route.
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.
Application provides a shortcut
flush method for flushing the
Instead of creating an instance of
RouteCollection yourself, use the
$app['controllers_factory'] factory instead.