Commit Graph

105 Commits

Author SHA1 Message Date
Fabien Potencier
e6f1248151 [HttpKernel] added back Bundle::getName() as it is quite useful 2011-01-21 09:45:37 +01:00
Fabien Potencier
6d1e91a1fa refactored bundle management
Before I explain the changes, let's talk about the current state.

Before this patch, the registerBundleDirs() method returned an ordered (for
resource overloading) list of namespace prefixes and the path to their
location. Here are some problems with this approach:

 * The paths set by this method and the paths configured for the autoloader
   can be disconnected (leading to unexpected behaviors);

 * A bundle outside these paths worked, but unexpected behavior can occur;

 * Choosing a bundle namespace was limited to the registered namespace
   prefixes, and their number should stay low enough (for performance reasons)
   -- moreover the current Bundle\ and Application\ top namespaces does not
   respect the standard rules for namespaces (first segment should be the
   vendor name);

 * Developers must understand the concept of "namespace prefixes" to
   understand the overloading mechanism, which is one more thing to learn,
   which is Symfony specific;

 * Each time you want to get a resource that can be overloaded (a template for
   instance), Symfony would have tried all namespace prefixes one after the
   other until if finds a matching file. But that can be computed in advance
   to reduce the overhead.

Another topic which was not really well addressed is how you can reference a
file/resource from a bundle (and take into account the possibility of
overloading). For instance, in the routing, you can import a file from a
bundle like this:

  <import resource="FrameworkBundle/Resources/config/internal.xml" />

Again, this works only because we have a limited number of possible namespace
prefixes.

This patch addresses these problems and some more.

First, the registerBundleDirs() method has been removed. It means that you are
now free to use any namespace for your bundles. No need to have specific
prefixes anymore. You are also free to store them anywhere, in as many
directories as you want. You just need to be sure that they are autoloaded
correctly.

The bundle "name" is now always the short name of the bundle class (like
FrameworkBundle or SensioCasBundle). As the best practice is to prefix the
bundle name with the vendor name, it's up to the vendor to ensure that each
bundle name is unique. I insist that a bundle name must be unique. This was
the opposite before as two bundles with the same name was how Symfony2 found
inheritance.

A new getParent() method has been added to BundleInterface. It returns the
bundle name that the bundle overrides (this is optional of course). That way,
there is no ordering problem anymore as the inheritance tree is explicitely
defined by the bundle themselves.

So, with this system, we can easily have an inheritance tree like the
following:

FooBundle < MyFooBundle < MyCustomFooBundle

MyCustomFooBundle returns MyFooBundle for the getParent() method, and
MyFooBundle returns FooBundle.

If two bundles override the same bundle, an exception is thrown.

Based on the bundle name, you can now reference any resource with this
notation:

    @FooBundle/Resources/config/routing.xml
    @FooBundle/Controller/FooController.php

This notation is the input of the Kernel::locateResource() method, which
returns the location of the file (and of course it takes into account
overloading).

So, in the routing, you can now use the following:

    <import resource="@FrameworkBundle/Resources/config/internal.xml" />

The template loading mechanism also use this method under the hood.

As a bonus, all the code that converts from internal notations to file names
(controller names: ControllerNameParser, template names: TemplateNameParser,
resource paths, ...) is now contained in several well-defined classes. The
same goes for the code that look for templates (TemplateLocator), routing
files (FileLocator), ...

As a side note, it is really easy to also support multiple-inheritance for a
bundle (for instance if a bundle returns an array of bundle names it extends).
However, this is not implemented in this patch as I'm not sure we want to
support that.

How to upgrade:

 * Each bundle must now implement two new mandatory methods: getPath() and
   getNamespace(), and optionally the getParent() method if the bundle extends
   another one. Here is a common implementation for these methods:

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'MyFrameworkBundle';
    }

    /**
     * {@inheritdoc}
     */
    public function getNamespace()
    {
        return __NAMESPACE__;
    }

    /**
     * {@inheritdoc}
     */
    public function getPath()
    {
        return strtr(__DIR__, '\\', '/');
    }

 * The registerBundleDirs() can be removed from your Kernel class;

 * If your code relies on getBundleDirs() or the kernel.bundle_dirs parameter,
   it should be upgraded to use the new interface (see Doctrine commands for
   many example of such a change);

 * When referencing a bundle, you must now always use its name (no more \ or /
   in bundle names) -- this transition was already done for most things
   before, and now applies to the routing as well;

 * Imports in routing files must be changed:
    Before: <import resource="Sensio/CasBundle/Resources/config/internal.xml" />
    After:  <import resource="@SensioCasBundle/Resources/config/internal.xml" />
2011-01-20 18:42:47 +01:00
Fabien Potencier
67f13fee9e [HttpKernel] made a small tweak 2011-01-20 11:38:17 +01:00
Jeremy Mikola
e414e06327 [HttpKernel] Fix AccessDecisionManagerInterface::decide() invocation in SwitchUserListener 2011-01-20 07:14:46 +01:00
Victor Berchet
3e8f8ea6af [ProfilerStorage] Make write() returns a status (Boolean) 2011-01-19 07:38:46 +01:00
Victor Berchet
db42ab21f0 [SQLiteProfilerStorage] Escape '\' in find() 2011-01-19 07:35:20 +01:00
Bulat Shakirzyanov
267a7e6956 [HttpKernel] fixed Cache, to respect the variable and trigger error handling 2011-01-19 07:31:27 +01:00
Dominique Bongiraud
64fb94c725 normalized license messages in PHP files 2011-01-18 08:07:46 +01:00
Fabien Potencier
a327f1a944 added some phpdoc 2011-01-17 20:41:55 +01:00
Fabien Potencier
00b19e234d fixed typos 2011-01-17 20:23:32 +01:00
Fabien Potencier
f4cf31a275 made some minor tweaks 2011-01-17 17:46:27 +01:00
Fabien Potencier
71d5be1d6b tweaked behavior of ExceptionListener to display better error messages in case of an exception thrown during the handling of an exception 2011-01-17 17:41:48 +01:00
Fabien Potencier
d406ca0d6b [FrameworkBundle] made ESI optional (should now be enabled explicitely) 2011-01-17 16:21:46 +01:00
Christophe Coevoet
105d5918bc Added the roles in the Security panel of the profiler 2011-01-17 07:40:28 +01:00
Fabien Potencier
b7d2528384 added a way for any extension to add classes to the class cache 2011-01-16 11:32:17 +01:00
Fabien Potencier
be35aa1d6a [HttpKernel] added the possibility to add non-namespaced classes to the compiled class cache 2011-01-16 11:32:14 +01:00
Fabien Potencier
5c64ca8a30 renamed Container::freeze() to Container::compile() 2011-01-16 08:12:36 +01:00
Ryan Weaver
769344733a [Cache] Fixing a coding standard, adding a small note for clarity, and adding a missing type-hint. 2011-01-16 07:39:03 +01:00
Johannes M. Schmitt
98b52b607c better support for cookie handling, use native PHP function to set cookies 2011-01-15 20:47:29 +01:00
Fabien Potencier
272933d2ce fixed typo 2011-01-15 15:30:15 +01:00
Fabien Potencier
7ac6d59173 changed the bundle name to be the class name of the bundle, not the last part of the namespace
Let's take some examples to explain the change.

First, if you don't use any vendored bundles, this commit does not change anything.

So, let's say you use a FooBundle from Sensio. The files are stored under Bundle\Sensio\FooBundle.
And the Bundle class is Bundle\Sensio\FooBundle\SensioFooBundle.php.

Before the change, the bundle name ($bundle->getName()) would have returned 'FooBundle'.
Now it returns 'SensioFooBundle'.

Why does it matter? Well, it makes template names and controller names easier to read:

Before:

    Template: Sensio\FooBundle:Bar:index.twig.html
    Controller: Sensio\FooBundle:Bar:indexAction

After

    Template: SensioFooBundle:Bar:index.twig.html
    Controller: SensioFooBundle:Bar:indexAction

NB: Even if the change seems simple enough, the implementation is not. As finding
the namespace from the bundle class name is not trivial

NB2: If you don't follow the bundle name best practices, this will probably
leads to unexpected behaviors.
2011-01-15 15:17:01 +01:00
Fabien Potencier
5f177d5a51 [HttpKernel] removed unused and bugged method 2011-01-15 14:13:00 +01:00
Victor Berchet
cdd3ac962c [SQLiteProfilerStorage] Improve SQLite storage:
- do not rely on request time for db cleanup (important when importing data),
- add indexes
2011-01-14 08:28:17 +01:00
Victor Berchet
9ec69553f3 [Profiler] Use base64 encoding which is more efficient than unpack (space wise) 2011-01-14 08:28:13 +01:00
Victor Berchet
9770944a1d [SQLiteProfilerStorage] Escape special chars in URLs and IPs 2011-01-13 08:03:02 +01:00
Victor Berchet
9a2e053cbc [Event] Collected data is about listener (not event) calls 2011-01-11 14:57:18 +01:00
Martin Hason
08c3a2b40b method buildContainer divided into logical parts 2011-01-11 14:56:28 +01:00
Fabien Potencier
3734c0e01e updated bootstrap file 2011-01-10 08:01:04 +01:00
Igor Wiedler
dedf29ffda [HttpKernel] No longer reformat {} "a la python"
Removing newlines before closing braces leads to issues with heredoc/nowdoc
2011-01-10 08:00:04 +01:00
Fabien Potencier
10fee8c8bb [HttpKernel] added escaping to the profiler SQLite storage 2011-01-08 14:29:59 +01:00
Victor Berchet
96597024e8 [Profiler] Fix importing profiler data 2011-01-07 16:34:42 +01:00
Fabien Potencier
1148519695 [HttpKernel] unified paths on Windows and *nix 2011-01-04 18:21:58 +01:00
Jeremy Mikola
46b1b5bd60 [Security] LogoutListener should not invoke handlers' logout() method if token is empty
If a user was not authenticated and visited the logout path, a null value was passed to the handler's logout() method, resulting in a catchable fatal error.
2010-12-30 21:12:29 +01:00
Johannes M. Schmitt
03d25cc7fa refactored creation of access decision manager to make use of newly added compiler passes 2010-12-21 08:52:48 +01:00
Victor Berchet
d300fd6131 Remove a useless test 2010-12-20 17:59:02 +01:00
Victor Berchet
9ffb1637b9 Make use of SplFileInfo::getBasename 2010-12-20 17:58:58 +01:00
Fabien Potencier
b57411b5ec renamed reloadUserByAccount() to loadUserByAccount() 2010-12-18 08:15:13 +01:00
Johannes Schmitt
df6ffbbf07 remove user provider name 2010-12-18 08:10:53 +01:00
Pierre-Louis LAUNAY
a6e414f746 The method ->getHeader(...) doen't exists. Replace it by ->headers->get(...) 2010-12-16 20:13:40 +01:00
Johannes M. Schmitt
bd7e9b022b variable name fix 2010-12-15 21:24:37 +01:00
Johannes Schmitt
3c692bd160 fixed user refreshing after unserialization 2010-12-15 17:38:30 +01:00
Johannes Schmitt
abe8047262 added authentication trust resolver 2010-12-12 10:49:43 +01:00
Fabien Potencier
b3149a235b [HttpKernel] fixed request management in HttpKernel 2010-12-10 09:30:32 +01:00
Fabien Potencier
bff58d14d7 [HttpKernel] fixed request management in HttpKernel 2010-12-10 09:24:14 +01:00
Fabien Potencier
da26584735 [HttpKernel] fixed request management in HttpKernel 2010-12-10 09:21:31 +01:00
Fabien Potencier
55bed307f1 removed HttpException base class, refactored FlattenException class 2010-12-10 09:16:42 +01:00
Fabien Potencier
23fbd87164 [HttpKernel] removed UnauthorizedHttpException as this should be handled by the Security component 2010-12-10 09:02:26 +01:00
Fabien Potencier
131776001f removed ForbiddenHttpException
Both HttpKernel and Security define a 403 exception:

* Symfony\Component\HttpKernel\Exception\ForbiddenHttpException
* Symfony\Component\Security\Exception\AccessDeniedException

The one in HttpKernel has been removed in favor of the Security one.
2010-12-10 09:00:06 +01:00
Fabien Potencier
d036448542 [HttpKernel] simplified code 2010-12-10 08:50:45 +01:00
Ryan Weaver
be94daba66 [HttpKernel] Reworking the HttpException class constructor to be more consistent with normal OO classes. Additionally, the base HttpException constructor was changed to require a code argument as it doesn't make sense to create an exception that will translate into a status code of 0 (in fact it'll cause a strange error). 2010-12-10 08:47:25 +01:00