--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/symfony/UPDATE.md Sat Sep 24 15:40:41 2011 +0200
@@ -0,0 +1,863 @@
+How to update your project?
+===========================
+
+This document explains how to upgrade from one Symfony2 version to the next
+one. It only discusses changes that need to be done when using the "public"
+API of the framework. If you "hack" the core, you should probably follow the
+timeline closely anyway.
+
+RC4 to RC5
+----------
+
+* The `MapFileClassLoader` has been removed in favor of a new
+ `MapClassLoader`.
+
+* The `exception_controller` setting has been moved from the `framework`
+ section to the `twig` one.
+
+* The custom error pages must now reference `TwigBundle` instead of
+ `FrameworkBundle` (see
+ http://symfony.com/doc/2.0/cookbook/controller/error_pages.html)
+
+* `EntityUserProvider` class has been moved and FQCN changed from
+ `Symfony\Component\Security\Core\User\EntityUserProvider` to
+ `Symfony\Bridge\Doctrine\Security\User\EntityUserProvider`.
+
+* Cookies access from `HeaderBag` has been removed. Accessing Request cookies
+ must be done via `Request::$cookies``.
+
+* `ResponseHeaderBag::getCookie()` and `ResponseHeaderBag::hasCookie()`
+ methods were removed.
+
+* The method `ResponseHeaderBag::getCookies()` now supports an argument for the
+ returned format (possible values are `ResponseHeaderBag::COOKIES_FLAT`
+ (default value) or `ResponseHeaderBag::COOKIES_ARRAY`).
+
+ * `ResponseHeaderBag::COOKIES_FLAT` returns a simple array (the array keys
+ are not cookie names anymore):
+
+ * array(0 => `a Cookie instance`, 1 => `another Cookie instance`)
+
+ * `ResponseHeaderBag::COOKIES_ARRAY` returns a multi-dimensional array:
+
+ * array(`the domain` => array(`the path` => array(`the cookie name` => `a Cookie instance`)))
+
+* Removed the guesser for the Choice constraint as the constraint only knows
+ about the valid keys, and not their values.
+
+* The configuration of MonologBundle has been refactored.
+
+ * Only services are supported for the processors. They are now registered
+ using the `monolog.processor` tag which accept three optionnal attributes:
+
+ * `handler`: the name of an handler to register it only for a specific handler
+ * `channel`: to register it only for one logging channel (exclusive with `handler`)
+ * `method`: The method used to process the record (`__invoke` is used if not set)
+
+ * The email_prototype for the `SwiftMailerHandler` only accept a service id now.
+
+ * Before:
+
+ email_prototype: @acme_demo.monolog.email_prototype
+
+ * After:
+
+ email_prototype: acme_demo.monolog.email_prototype
+
+ or if you want to use a factory for the prototype:
+
+ email_prototype:
+ id: acme_demo.monolog.email_prototype
+ method: getPrototype
+
+* To avoid security issues, HTTP headers coming from proxies are not trusted
+ anymore by default (like `HTTP_X_FORWARDED_FOR`, `X_FORWARDED_PROTO`, and
+ `X_FORWARDED_HOST`). If your application is behind a reverse proxy, add the
+ following configuration:
+
+ framework:
+ trust_proxy_headers: true
+
+* To avoid hidden naming collisions, the AbstractType does not try to define
+ the name of form types magically. You now need to implement the `getName()`
+ method explicitly when creating a custom type.
+
+* Renamed some methods to follow the naming conventions:
+
+ Session::getAttributes() -> Session::all()
+ Session::setAttributes() -> Session::replace()
+
+* {_locale} is not supported in paths in the access_control section anymore. You can
+ rewrite the paths using a regular expression such as "(?:[a-z]{2})".
+
+RC3 to RC4
+----------
+
+* Annotation classes must be annotated with @Annotation
+ (see the validator constraints for examples)
+
+* Annotations are not using the PHP autoloading but their own mechanism. This
+ allows much more control about possible failure states. To make your code
+ work, add the following lines at the end of your `autoload.php` file:
+
+ use Doctrine\Common\Annotations\AnnotationRegistry;
+
+ AnnotationRegistry::registerLoader(function($class) use ($loader) {
+ $loader->loadClass($class);
+ return class_exists($class, false);
+ });
+
+ AnnotationRegistry::registerFile(
+ __DIR__.'/../vendor/doctrine/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php'
+ );
+
+ The `$loader` variable is an instance of `UniversalClassLoader`.
+ Additionally you might have to adjust the ORM path to the
+ `DoctrineAnnotations.php`. If you are not using the `UniversalClassLoader`
+ see the [Doctrine Annotations
+ documentation](http://www.doctrine-project.org/docs/common/2.1/en/reference/annotations.html)
+ for more details on how to register annotations.
+
+beta5 to RC1
+------------
+
+* Renamed `Symfony\Bundle\FrameworkBundle\Command\Command` to
+ `Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand`
+
+* Removed the routing `AnnotGlobLoader` class
+
+* Some blocks in the Twig Form templates have been renamed to avoid
+ collisions:
+
+ * `container_attributes` to `widget_container_attributes`
+ * `attributes` to `widget_attributes`
+ * `options` to `widget_choice_options`
+
+* Event changes:
+
+ * All listeners must now be tagged with `kernel.event_listener` instead of
+ `kernel.listener`.
+ * Kernel events are now properly prefixed with `kernel` instead of `core`:
+
+ * Before:
+
+ <tag name="kernel.listener" event="core.request" method="onCoreRequest" />
+
+ * After:
+
+ <tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" />
+
+ Note: the method can of course remain as `onCoreRequest`, but renaming it
+ as well for consistency with future projects makes sense.
+
+ * The `Symfony\Component\HttpKernel\CoreEvents` class has been renamed to
+ `Symfony\Component\HttpKernel\KernelEvents`
+
+* `TrueValidator` and `FalseValidator` constraints validators no longer accepts any value as valid data.
+
+beta4 to beta5
+--------------
+
+* `UserProviderInterface::loadUser()` has been renamed to
+ `UserProviderInterface::refreshUser()` to make the goal of the method
+ clearer.
+
+* The `$kernel` property on `WebTestCase` is now static. Change any instances
+ of `$this->kernel` in your functional tests to `self::$kernel`.
+
+* The AsseticBundle has been moved to its own repository (it still bundled
+ with Symfony SE).
+
+* Yaml Component:
+
+ * Exception classes have been moved to their own namespace
+ * `Yaml::load()` has been renamed to `Yaml::parse()`
+
+* The File classes from `HttpFoundation` have been refactored:
+
+ * `Symfony\Component\HttpFoundation\File\File` has a new API:
+
+ * It now extends `\SplFileInfo`:
+
+ * former `getName()` equivalent is `getBasename()`,
+ * former `getDirectory()` equivalent is `getPath()`,
+ * former `getPath()` equivalent is `getRealPath()`.
+
+ * the `move()` method now creates the target directory when it does not exist,
+
+ * `getExtension()` and `guessExtension()` do not return the extension
+ with a leading `.` anymore
+
+ * `Symfony\Component\HttpFoundation\File\UploadedFile` has a new API:
+
+ * The constructor has a new Boolean parameter that must be set to true
+ in test mode only in order to be able to move the file. This parameter
+ is not intended to be set to true from outside of the core files.
+
+ * `getMimeType()` now always returns the mime type of the underlying file.
+ Use `getClientMimeType()` to get the mime type from the request.
+
+ * `getSize()` now always returns the size of the underlying file.
+ Use `getClientSize()` to get the file size from the request.
+
+ * Use `getClientOriginalName()` to retrieve the original name from the
+ request.
+
+* The `extensions` setting for Twig has been removed. There is now only one
+ way to register Twig extensions, via the `twig.extension` tag.
+
+* The stack of Monolog handlers now bubbles the records by default. To stop
+ the propagation you need to configure the bubbling explicitly.
+
+* Expanded the `SerializerInterface`, while reducing the number of public
+ methods in the Serializer class itself breaking BC and adding component
+ specific Exception classes.
+
+* The `FileType` Form class has been heavily changed:
+
+ * The temporary storage has been removed.
+
+ * The file type `type` option has also been removed (the new behavior is
+ the same as when the `type` was set to `file` before).
+
+ * The file input is now rendered as any other input field.
+
+* The `em` option of the Doctrine `EntityType` class now takes the entity
+ manager name instead of the EntityManager instance. If you don't pass this
+ option, the default Entity Manager will be used as before.
+
+* In the Console component: `Command::getFullname()` and
+ `Command::getNamespace()` have been removed (`Command::getName()` behavior
+ is now the same as the old `Command::getFullname()`).
+
+* Default Twig form templates have been moved to the Twig bridge. Here is how
+ you can reference them now from a template or in a configuration setting:
+
+ Before:
+
+ TwigBundle:Form:div_layout.html.twig
+
+ After:
+
+ form_div_layout.html.twig
+
+* All settings regarding the cache warmers have been removed.
+
+* `Response::isRedirected()` has been merged with `Response::isRedirect()`
+
+beta3 to beta4
+--------------
+
+* `Client::getProfiler` has been removed in favor of `Client::getProfile`,
+ which returns an instance of `Profile`.
+
+* Some `UniversalClassLoader` methods have been renamed:
+
+ * `registerPrefixFallback` to `registerPrefixFallbacks`
+ * `registerNamespaceFallback` to `registerNamespaceFallbacks`
+
+* The event system has been made more flexible. A listener can now be any
+ valid PHP callable.
+
+ * `EventDispatcher::addListener($eventName, $listener, $priority = 0)`:
+ * `$eventName` is the event name (cannot be an array anymore),
+ * `$listener` is a PHP callable.
+
+ * The events classes and constants have been renamed:
+
+ * Old class name `Symfony\Component\Form\Events` and constants:
+
+ Events::preBind = 'preBind'
+ Events::postBind = 'postBind'
+ Events::preSetData = 'preSetData'
+ Events::postSetData = 'postSetData'
+ Events::onBindClientData = 'onBindClientData'
+ Events::onBindNormData = 'onBindNormData'
+ Events::onSetData = 'onSetData'
+
+ * New class name `Symfony\Component\Form\FormEvents` and constants:
+
+ FormEvents::PRE_BIND = 'form.pre_bind'
+ FormEvents::POST_BIND = 'form.post_bind'
+ FormEvents::PRE_SET_DATA = 'form.pre_set_data'
+ FormEvents::POST_SET_DATA = 'form.post_set_data'
+ FormEvents::BIND_CLIENT_DATA = 'form.bind_client_data'
+ FormEvents::BIND_NORM_DATA = 'form.bind_norm_data'
+ FormEvents::SET_DATA = 'form.set_data'
+
+ * Old class name `Symfony\Component\HttpKernel\Events` and constants:
+
+ Events::onCoreRequest = 'onCoreRequest'
+ Events::onCoreException = 'onCoreException'
+ Events::onCoreView = 'onCoreView'
+ Events::onCoreController = 'onCoreController'
+ Events::onCoreResponse = 'onCoreResponse'
+
+ * New class name `Symfony\Component\HttpKernel\CoreEvents` and constants:
+
+ CoreEvents::REQUEST = 'core.request'
+ CoreEvents::EXCEPTION = 'core.exception'
+ CoreEvents::VIEW = 'core.view'
+ CoreEvents::CONTROLLER = 'core.controller'
+ CoreEvents::RESPONSE = 'core.response'
+
+ * Old class name `Symfony\Component\Security\Http\Events` and constants:
+
+ Events::onSecurityInteractiveLogin = 'onSecurityInteractiveLogin'
+ Events::onSecuritySwitchUser = 'onSecuritySwitchUser'
+
+ * New class name `Symfony\Component\Security\Http\SecurityEvents` and constants:
+
+ SecurityEvents::INTERACTIVE_LOGIN = 'security.interactive_login'
+ SecurityEvents::SWITCH_USER = 'security.switch_user'
+
+ * `addListenerService` now only takes a single event name as its first
+ argument,
+
+ * Tags in configuration must now set the method to call:
+
+ * Before:
+
+ <tag name="kernel.listener" event="onCoreRequest" />
+
+ * After:
+
+ <tag name="kernel.listener" event="core.request" method="onCoreRequest" />
+
+ * Subscribers must now always return a hash:
+
+ * Before:
+
+ public static function getSubscribedEvents()
+ {
+ return Events::onBindNormData;
+ }
+
+ * After:
+
+ public static function getSubscribedEvents()
+ {
+ return array(FormEvents::BIND_NORM_DATA => 'onBindNormData');
+ }
+
+* Form `DateType` parameter `single-text` changed to `single_text`
+* Form field label helpers now accepts setting attributes, i.e.:
+
+```html+jinja
+{{ form_label(form.name, 'Custom label', { 'attr': {'class': 'name_field'} }) }}
+```
+
+* In order to use Swiftmailer, you should now register its "init.php" file via
+ the autoloader ("app/autoloader.php") and remove the `Swift_` prefix from
+ the autoloader. For an example on how this should be done, see the Standard
+ Distribution
+ [autoload.php](https://github.com/symfony/symfony-standard/blob/v2.0.0BETA4/app/autoload.php#L29).
+
+beta2 to beta3
+--------------
+
+* The settings under `framework.annotations` have changed slightly:
+
+ Before:
+
+ framework:
+ annotations:
+ cache: file
+ file_cache:
+ debug: true
+ dir: /foo
+
+ After:
+
+ framework:
+ annotations:
+ cache: file
+ debug: true
+ file_cache_dir: /foo
+
+beta1 to beta2
+--------------
+
+* The annotation parsing process has been changed (it now uses Doctrine Common
+ 3.0). All annotations which are used in a class must now be imported (just
+ like you import PHP namespaces with the "use" statement):
+
+ Before:
+
+``` php
+<?php
+
+/**
+ * @orm:Entity
+ */
+class AcmeUser
+{
+ /**
+ * @orm:Id
+ * @orm:GeneratedValue(strategy = "AUTO")
+ * @orm:Column(type="integer")
+ * @var integer
+ */
+ private $id;
+
+ /**
+ * @orm:Column(type="string", nullable=false)
+ * @assert:NotBlank
+ * @var string
+ */
+ private $name;
+}
+```
+ After:
+
+``` php
+<?php
+
+use Doctrine\ORM\Mapping as ORM;
+use Symfony\Component\Validator\Constraints as Assert;
+
+/**
+ * @ORM\Entity
+ */
+class AcmeUser
+{
+ /**
+ * @ORM\Id
+ * @ORM\GeneratedValue(strategy="AUTO")
+ * @ORM\Column(type="integer")
+ *
+ * @var integer
+ */
+ private $id;
+
+ /**
+ * @ORM\Column(type="string", nullable=false)
+ * @Assert\NotBlank
+ *
+ * @var string
+ */
+ private $name;
+}
+```
+
+* The `Set` constraint has been removed as it is not required anymore.
+
+Before:
+
+``` php
+<?php
+
+/**
+ * @orm:Entity
+ */
+class AcmeEntity
+{
+ /**
+ * @assert:Set({@assert:Callback(...), @assert:Callback(...)})
+ */
+ private $foo;
+}
+```
+After:
+
+``` php
+<?php
+
+use Doctrine\ORM\Mapping as ORM;
+use Symfony\Component\Validator\Constraints\Callback;
+
+/**
+ * @ORM\Entity
+ */
+class AcmeEntity
+{
+ /**
+ * @Callback(...)
+ * @Callback(...)
+ */
+ private $foo;
+}
+```
+
+* The config under `framework.validation.annotations` has been removed and was
+ replaced with a boolean flag `framework.validation.enable_annotations` which
+ defaults to false.
+
+* Forms must now be explicitly enabled (automatically done in Symfony SE):
+
+ framework:
+ form: ~
+
+ Which is equivalent to:
+
+ framework:
+ form:
+ enabled: true
+
+* The Routing Exceptions have been moved:
+
+ Before:
+
+ Symfony\Component\Routing\Matcher\Exception\Exception
+ Symfony\Component\Routing\Matcher\Exception\NotFoundException
+ Symfony\Component\Routing\Matcher\Exception\MethodNotAllowedException
+
+ After:
+
+ Symfony\Component\Routing\Exception\Exception
+ Symfony\Component\Routing\Exception\NotFoundException
+ Symfony\Component\Routing\Exception\MethodNotAllowedException
+
+* The form component's `csrf_page_id` option has been renamed to
+ `intention`.
+
+* The `error_handler` setting has been removed. The `ErrorHandler` class
+ is now managed directly by Symfony SE in `AppKernel`.
+
+* The Doctrine metadata files has moved from
+ `Resources/config/doctrine/metadata/orm/` to `Resources/config/doctrine`,
+ the extension from `.dcm.yml` to `.orm.yml`, and the file name has been
+ changed to the short class name.
+
+ Before:
+
+ Resources/config/doctrine/metadata/orm/Bundle.Entity.dcm.xml
+ Resources/config/doctrine/metadata/orm/Bundle.Entity.dcm.yml
+
+ After:
+
+ Resources/config/doctrine/Entity.orm.xml
+ Resources/config/doctrine/Entity.orm.yml
+
+* With the introduction of a new Doctrine Registry class, the following
+ parameters have been removed (replaced by methods on the `doctrine`
+ service):
+
+ * `doctrine.orm.entity_managers`
+ * `doctrine.orm.default_entity_manager`
+ * `doctrine.dbal.default_connection`
+
+ Before:
+
+ $container->getParameter('doctrine.orm.entity_managers')
+ $container->getParameter('doctrine.orm.default_entity_manager')
+ $container->getParameter('doctrine.orm.default_connection')
+
+ After:
+
+ $container->get('doctrine')->getEntityManagerNames()
+ $container->get('doctrine')->getDefaultEntityManagerName()
+ $container->get('doctrine')->getDefaultConnectionName()
+
+ But you don't really need to use these methods anymore, as to get an entity
+ manager, you can now use the registry directly:
+
+ Before:
+
+ $em = $this->get('doctrine.orm.entity_manager');
+ $em = $this->get('doctrine.orm.foobar_entity_manager');
+
+ After:
+
+ $em = $this->get('doctrine')->getEntityManager();
+ $em = $this->get('doctrine')->getEntityManager('foobar');
+
+* The `doctrine:generate:entities` arguments and options changed. Run
+ `./app/console doctrine:generate:entities --help` for more information about
+ the new syntax.
+
+* The `doctrine:generate:repositories` command has been removed. The
+ functionality has been moved to the `doctrine:generate:entities`.
+
+* Doctrine event subscribers now use a unique "doctrine.event_subscriber" tag.
+ Doctrine event listeners also use a unique "doctrine.event_listener" tag. To
+ specify a connection, use the optional "connection" attribute.
+
+ Before:
+
+ listener:
+ class: MyEventListener
+ tags:
+ - { name: doctrine.common.event_listener, event: name }
+ - { name: doctrine.dbal.default_event_listener, event: name }
+ subscriber:
+ class: MyEventSubscriber
+ tags:
+ - { name: doctrine.common.event_subscriber }
+ - { name: doctrine.dbal.default_event_subscriber }
+
+ After:
+
+ listener:
+ class: MyEventListener
+ tags:
+ - { name: doctrine.event_listener, event: name } # register for all connections
+ - { name: doctrine.event_listener, event: name, connection: default } # only for the default connection
+ subscriber:
+ class: MyEventSubscriber
+ tags:
+ - { name: doctrine.event_subscriber } # register for all connections
+ - { name: doctrine.event_subscriber, connection: default } # only for the default connection
+
+* Application translations are now stored in the `Resources` directory:
+
+ Before:
+
+ app/translations/catalogue.fr.xml
+
+ After:
+
+ app/Resources/translations/catalogue.fr.xml
+
+* The option `modifiable` of the `collection` form type was split into two
+ options `allow_add` and `allow_delete`.
+
+ Before:
+
+ $builder->add('tags', 'collection', array(
+ 'type' => 'text',
+ 'modifiable' => true,
+ ));
+
+ After:
+
+ $builder->add('tags', 'collection', array(
+ 'type' => 'text',
+ 'allow_add' => true,
+ 'allow_delete' => true,
+ ));
+
+* `Request::hasSession()` has been renamed to `Request::hasPreviousSession()`. The
+ method `hasSession()` still exists, but only checks if the request contains a
+ session object, not if the session was started in a previous request.
+
+* Serializer: The NormalizerInterface's `supports()` method has been split in
+ two methods: `supportsNormalization()` and `supportsDenormalization()`.
+
+* `ParameterBag::getDeep()` has been removed, and is replaced with a boolean flag
+ on the `ParameterBag::get()` method.
+
+* Serializer: `AbstractEncoder` & `AbstractNormalizer` were renamed to
+ `SerializerAwareEncoder` & `SerializerAwareNormalizer`.
+
+* Serializer: The `$properties` argument has been dropped from all interfaces.
+
+* Form: Renamed option value `text` of `widget` option of the `date` type was
+ renamed to `single-text`. `text` indicates to use separate text boxes now
+ (like for the `time` type).
+
+* Form: Renamed view variable `name` to `full_name`. The variable `name` now
+ contains the local, short name (equivalent to `$form->getName()`).
+
+PR12 to beta1
+-------------
+
+* The CSRF secret configuration has been moved to a mandatory global `secret`
+ setting (as the secret is now used for everything and not just CSRF):
+
+ Before:
+
+ framework:
+ csrf_protection:
+ secret: S3cr3t
+
+ After:
+
+ framework:
+ secret: S3cr3t
+
+* The `File::getWebPath()` and `File::rename()` methods have been removed, as
+ well as the `framework.document_root` configuration setting.
+
+* The `File::getDefaultExtension()` method has been renamed to `File::guessExtension()`.
+ The renamed method now returns null if it cannot guess the extension.
+
+* The `session` configuration has been refactored:
+
+ * The `class` option has been removed (use the `session.class` parameter
+ instead);
+
+ * The PDO session storage configuration has been removed (a cookbook recipe
+ is in the work);
+
+ * The `storage_id` option now takes a service id instead of just part of it.
+
+* The `DoctrineMigrationsBundle` and `DoctrineFixturesBundle` bundles have
+ been moved to their own repositories.
+
+* The form framework has been refactored extensively (more information in the
+ documentation).
+
+* The `trans` tag does not accept a message as an argument anymore:
+
+ {% trans "foo" %}
+ {% trans foo %}
+
+ Use the long version the tags or the filter instead:
+
+ {% trans %}foo{% endtrans %}
+ {{ foo|trans }}
+
+ This has been done to clarify the usage of the tag and filter and also to
+ make it clearer when the automatic output escaping rules are applied (see
+ the doc for more information).
+
+* Some methods in the DependencyInjection component's `ContainerBuilder` and
+ `Definition` classes have been renamed to be more specific and consistent:
+
+ Before:
+
+ $container->remove('my_definition');
+ $definition->setArgument(0, 'foo');
+
+ After:
+
+ $container->removeDefinition('my_definition');
+ $definition->replaceArgument(0, 'foo');
+
+* In the rememberme configuration, the `token_provider key` now expects a real
+ service id instead of only a suffix.
+
+PR11 to PR12
+------------
+
+* `HttpFoundation\Cookie::getExpire()` was renamed to `getExpiresTime()`
+
+* XML configurations have been normalized. All tags with only one attribute
+ have been converted to tag content:
+
+ Before:
+
+ <bundle name="MyBundle" />
+ <app:engine id="twig" />
+ <twig:extension id="twig.extension.debug" />
+
+ After:
+
+ <bundle>MyBundle</bundle>
+ <app:engine>twig</app:engine>
+ <twig:extension>twig.extension.debug</twig:extension>
+
+* Fixes a critical security issue which allowed all users to switch to
+ arbitrary accounts when the SwitchUserListener was activated. Configurations
+ which do not use the SwitchUserListener are not affected.
+
+* The Dependency Injection Container now strongly validates the references of
+ all your services at the end of its compilation process. If you have invalid
+ references this will result in a compile-time exception instead of a run-time
+ exception (the previous behavior).
+
+PR10 to PR11
+------------
+
+* Extension configuration classes should now implement the
+ `Symfony\Component\Config\Definition\ConfigurationInterface` interface. Note
+ that the BC is kept but implementing this interface in your extensions will
+ allow for further developments.
+
+* The `fingerscrossed` Monolog option has been renamed to `fingers_crossed`.
+
+PR9 to PR10
+-----------
+
+* Bundle logical names earned back their `Bundle` suffix:
+
+ *Controllers*: `Blog:Post:show` -> `BlogBundle:Post:show`
+
+ *Templates*: `Blog:Post:show.html.twig` -> `BlogBundle:Post:show.html.twig`
+
+ *Resources*: `@Blog/Resources/config/blog.xml` -> `@BlogBundle/Resources/config/blog.xml`
+
+ *Doctrine*: `$em->find('Blog:Post', $id)` -> `$em->find('BlogBundle:Post', $id)`
+
+* `ZendBundle` has been replaced by `MonologBundle`. Have a look at the
+ changes made to Symfony SE to see how to upgrade your projects:
+ https://github.com/symfony/symfony-standard/pull/30/files
+
+* Almost all core bundles parameters have been removed. You should use the
+ settings exposed by the bundle extension configuration instead.
+
+* Some core bundles service names changed for better consistency.
+
+* Namespace for validators has changed from `validation` to `assert` (it was
+ announced for PR9 but it was not the case then):
+
+ Before:
+
+ @validation:NotNull
+
+ After:
+
+ @assert:NotNull
+
+ Moreover, the `Assert` prefix used for some constraints has been removed
+ (`AssertTrue` to `True`).
+
+* `ApplicationTester::getDisplay()` and `CommandTester::getDisplay()` method
+ now return the command exit code
+
+PR8 to PR9
+----------
+
+* `Symfony\Bundle\FrameworkBundle\Util\Filesystem` has been moved to
+ `Symfony\Component\HttpKernel\Util\Filesystem`
+
+* The `Execute` constraint has been renamed to `Callback`
+
+* The HTTP exceptions classes signatures have changed:
+
+ Before:
+
+ throw new NotFoundHttpException('Not Found', $message, 0, $e);
+
+ After:
+
+ throw new NotFoundHttpException($message, $e);
+
+* The RequestMatcher class does not add `^` and `$` anymore to regexp.
+
+ You need to update your security configuration accordingly for instance:
+
+ Before:
+
+ pattern: /_profiler.*
+ pattern: /login
+
+ After:
+
+ pattern: ^/_profiler
+ pattern: ^/login$
+
+* Global templates under `app/` moved to a new location (old directory did not
+ work anyway):
+
+ Before:
+
+ app/views/base.html.twig
+ app/views/AcmeDemoBundle/base.html.twig
+
+ After:
+
+ app/Resources/views/base.html.twig
+ app/Resources/AcmeDemo/views/base.html.twig
+
+* Bundle logical names lose their `Bundle` suffix:
+
+ *Controllers*: `BlogBundle:Post:show` -> `Blog:Post:show`
+
+ *Templates*: `BlogBundle:Post:show.html.twig` -> `Blog:Post:show.html.twig`
+
+ *Resources*: `@BlogBundle/Resources/config/blog.xml` -> `@Blog/Resources/config/blog.xml`
+
+ *Doctrine*: `$em->find('BlogBundle:Post', $id)` -> `$em->find('Blog:Post', $id)`
+
+* Assetic filters must be now explicitly loaded:
+
+ assetic:
+ filters:
+ cssrewrite: ~
+ yui_css:
+ jar: "/path/to/yuicompressor.jar"
+ my_filter:
+ resource: "%kernel.root_dir%/config/my_filter.xml"
+ foo: bar