Commit Graph

693 Commits

Author SHA1 Message Date
Ryan Weaver
17f9162b89 [Standards] Changing many instances of "boolean" to "Boolean". 2011-01-21 09:53:24 +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
Dominique Bongiraud
64fb94c725 normalized license messages in PHP files 2011-01-18 08:07:46 +01:00
Fabien Potencier
6dd1d6172f fixed some routing patterns 2011-01-12 07:10:57 +01:00
Fabien Potencier
b63de46374 [Routing] moved from :var to {var}
This follows the "URI template" notation:

http://code.google.com/p/uri-templates/
http://tools.ietf.org/html/draft-gregorio-uritemplate-04

You need to change all your route definitions from something like:

    /article/:id

to something like:

    /article/{id}
2011-01-11 19:13:16 +01:00
Kris Wallsmith
763ef35d0e [Routing] added creation of a file resource in annotations loader 2010-12-22 11:19:05 +01:00
Kris Wallsmith
32aef96441 [Routing] removed call to setDefaultAnnotationNamespace() so this can be configure on the injected reader 2010-12-22 11:18:44 +01:00
Benjamin Lévêque
8a472b7d98 [Routing] Fix PhpMatcherDump when url contains a . or a - 2010-12-22 11:14:49 +01:00
Victor Berchet
5e94807668 Speed up url matching for route without variable 2010-12-20 18:25:32 +01:00
Fabien Potencier
5857576024 [Routing] added . as a valid character in route names 2010-12-12 08:53:49 +01:00
Fabien Potencier
7cb8dca04d [Routing] added . as a valid character in route names 2010-12-12 08:53:18 +01:00
Fabien Potencier
504463c307 [Routing] refactored code 2010-12-12 08:50:46 +01:00
Fabien Potencier
48e30537c4 added exception when a loaded YAML resource is not an array 2010-12-12 08:39:37 +01:00
Jeremy Mikola
c8c9fba7d9 [Routing] Add optional "type" param for loader hinting when resource strings are ambiguous
Currently, ambiguities only arise for PHP files, as PhpFileLoader and AnnotationFileLoader would both claim support.  Future conflicts may occur if the XML, YAML, or PHP loaders were to receive Directory and Glob loaders (as annotations have).

Since the "type" parameter is optional, loader resolution will default to awarding resolution to the first loader to claim support.  A previous hack in PhpFileLoader to avoid an AnnotationFileLoader conflict was removed, so that should be the only lost backwards compatibility with this patch.  Unit tests were also created for the various loader classes, although only the supports() method is being tested.

This implementation was proposed on the symfony-dev mailing list in response to Fabien's RFC for custom loader notation: http://groups.google.com/group/symfony-devs/browse_thread/thread/3104c1a9e45799d2/20fbe393c1afe088
2010-12-10 09:48:10 +01:00
Fabien Potencier
45e34c29fd [Routing] simplified code 2010-11-30 21:10:55 +01:00
pablodip
794634db7c [Routing] changed method_exists by an array with the routes names in the php generator dumper, its more efficient 2010-11-30 20:59:58 +01:00
Fabien Potencier
dca8a79bf5 [Routing] made annotation class loader more flexible 2010-11-30 14:00:48 +01:00
Fabien Potencier
b2eec52429 [Routing] added missing Route::setRequirement() 2010-11-30 14:00:36 +01:00
Ryan Weaver
bd0d9dc1cb [Routing] Fixing a coding standard violating I introduced. 2010-11-29 18:23:02 +01:00
Ryan Weaver
739ebf92f5 [Routing] Changing the _method route requirement to be a regular expression so that it's consistent with all other requirements.
Unlike all other requirements, the _method regex requirement is case-insensitive.
2010-11-27 11:48:57 +01:00
Ryan Weaver
acb977aa88 [Routing] Tweaking the ApacheMatcherDumper formatting - no real change. 2010-11-27 11:48:00 +01:00
Ryan Weaver
1e9e1b346d [Routing] Adding tests for the ApacheMatcherDumper, PhpMatcherDumper and UrlMatcher. 2010-11-27 11:47:48 +01:00
Ryan Weaver
5aa6ad28ae Updating RouteCollection::getRoutes() call to RouteCollection::getAll() in many places. 2010-11-26 14:43:12 +01:00
Ryan Weaver
f0ee10112e [Routing] Updating changed method name after method name refactoring. 2010-11-26 14:43:07 +01:00
Fabien Potencier
944d91c1df made some method name changes to have a better coherence throughout the framework
When an object has a "main" many relation with related "things" (objects,
parameters, ...), the method names are normalized:

 * get()
 * set()
 * all()
 * replace()
 * remove()
 * clear()
 * isEmpty()
 * add()
 * register()
 * count()
 * keys()

The classes below follow this method naming convention:

 * BrowserKit\CookieJar -> Cookie
 * BrowserKit\History -> Request
 * Console\Application -> Command
 * Console\Application\Helper\HelperSet -> HelperInterface
 * DependencyInjection\Container -> services
 * DependencyInjection\ContainerBuilder -> services
 * DependencyInjection\ParameterBag\ParameterBag -> parameters
 * DependencyInjection\ParameterBag\FrozenParameterBag -> parameters
 * DomCrawler\Form -> FormField
 * EventDispatcher\Event -> parameters
 * Form\FieldGroup -> Field
 * HttpFoundation\HeaderBag -> headers
 * HttpFoundation\ParameterBag -> parameters
 * HttpFoundation\Session -> attributes
 * HttpKernel\Profiler\Profiler -> DataCollectorInterface
 * Routing\RouteCollection -> Route
 * Security\Authentication\AuthenticationProviderManager -> AuthenticationProviderInterface
 * Templating\Engine -> HelperInterface
 * Translation\MessageCatalogue -> messages

The usage of these methods are only allowed when it is clear that there is a
main relation:

 * a CookieJar has many Cookies;

 * a Container has many services and many parameters (as services is the main
   relation, we use the naming convention for this relation);

 * a Console Input has many arguments and many options. There is no "main"
   relation, and so the naming convention does not apply.

For many relations where the convention does not apply, the following methods
must be used instead (where XXX is the name of the related thing):

 * get()      -> getXXX()
 * set()      -> setXXX()
 * all()      -> getXXXs()
 * replace()  -> setXXXs()
 * remove()   -> removeXXX()
 * clear()    -> clearXXX()
 * isEmpty()  -> isEmptyXXX()
 * add()      -> addXXX()
 * register() -> registerXXX()
 * count()    -> countXXX()
 * keys()
2010-11-25 17:30:06 +01:00
Fabien Potencier
a79ed13624 [Routing] removed the variable_prefixes and variable_regex Route options 2010-11-22 11:04:53 +01:00
Fabien Potencier
44ccd44dd6 [Routing] fixed ApacheMatcherDumper default config 2010-11-11 23:22:15 +01:00
Fabien Potencier
7f8c540a20 [Routing] fixed XML loader on Windows (there is no need to urlencode here as schemaValidate() takes a filename, not a URL) 2010-10-28 09:17:11 +02:00
Ryan Weaver
84a60d74d1 Allowing a routes node to be specified without any child import or route nodes.
This is not really a bug or a big issue, but if you need to temporarily empty a routes node, Symfony shouldn't care - it's not an actual validation failure (a routes node still makes sense without an route or import children).
2010-10-22 13:21:55 +02:00
Ryan Weaver
cc4f2bd955 Adding a type-hint to XmlFileLoader::validate(). 2010-10-22 08:22:08 +02:00
Fabien Potencier
92c56a5066 Revert "[Routing] allowed multiple routing requirement with xml loader, using comma separated values"
This reverts commit e8bcbcba57.
2010-10-21 08:13:10 +02:00
ornicar
e8bcbcba57 [Routing] allowed multiple routing requirement with xml loader, using comma separated values 2010-10-20 14:32:36 +02:00
Kris Wallsmith
f79e23ffb5 Removed all those spaces after @author that were bothering me so… 2010-10-18 16:55:41 +02:00
Kris Wallsmith
0b1f3145ae Removed unnecessary "public" from interface method signatures. 2010-10-18 16:55:09 +02:00
Artur Kotyrba
308e85a5a7 Removed methods which implemented interfaces by throwing \LogicException('You must override...'). 2010-10-17 07:54:18 +02:00
pborreli
86cc6a11d9 [Component] Fixed some spelling typos 2010-10-17 07:51:50 +02:00
Ryan Weaver
c39635680f added PHPDoc 2010-10-13 07:29:41 +02:00
Ryan Weaver
8c70a2ee24 Adding basic PHPDoc to the Routing\DelegatingLoader class. 2010-10-12 06:58:51 +02:00
Fabien Potencier
c39534e258 [Routing] removed the autoloading trick, which is not needed anymore 2010-09-07 16:15:13 +02:00
Fabien Potencier
b753ea45b2 [Routing] added 'defaults' support in Annotation class loader 2010-09-07 13:55:45 +02:00
Fabien Potencier
130494066d [Routing] added an annotation loader 2010-09-07 09:44:08 +02:00
Sébastien HOUZE
179fe8e623 Symfony\Component\Routing\Route::setRequirements() _method requirement can be an array, no substr on it 2010-09-03 12:01:57 +02:00
Fabien Potencier
bf82cf42dd renamed Symfony\Components to Symfony\Component 2010-08-20 23:09:55 +02:00