vendor/symfony/UPDATE.md
changeset 0 7f95f8617b0b
equal deleted inserted replaced
-1:000000000000 0:7f95f8617b0b
       
     1 How to update your project?
       
     2 ===========================
       
     3 
       
     4 This document explains how to upgrade from one Symfony2 version to the next
       
     5 one. It only discusses changes that need to be done when using the "public"
       
     6 API of the framework. If you "hack" the core, you should probably follow the
       
     7 timeline closely anyway.
       
     8 
       
     9 RC4 to RC5
       
    10 ----------
       
    11 
       
    12 * The `MapFileClassLoader` has been removed in favor of a new
       
    13   `MapClassLoader`.
       
    14 
       
    15 * The `exception_controller` setting has been moved from the `framework`
       
    16   section to the `twig` one.
       
    17 
       
    18 * The custom error pages must now reference `TwigBundle` instead of
       
    19   `FrameworkBundle` (see
       
    20   http://symfony.com/doc/2.0/cookbook/controller/error_pages.html)
       
    21 
       
    22 * `EntityUserProvider` class has been moved and FQCN changed from
       
    23   `Symfony\Component\Security\Core\User\EntityUserProvider` to
       
    24   `Symfony\Bridge\Doctrine\Security\User\EntityUserProvider`.
       
    25 
       
    26 * Cookies access from `HeaderBag` has been removed. Accessing Request cookies
       
    27   must be done via `Request::$cookies``.
       
    28 
       
    29 * `ResponseHeaderBag::getCookie()` and `ResponseHeaderBag::hasCookie()`
       
    30   methods were removed.
       
    31 
       
    32 * The method `ResponseHeaderBag::getCookies()` now supports an argument for the
       
    33   returned format (possible values are `ResponseHeaderBag::COOKIES_FLAT`
       
    34   (default value) or `ResponseHeaderBag::COOKIES_ARRAY`).
       
    35 
       
    36     * `ResponseHeaderBag::COOKIES_FLAT` returns a simple array (the array keys
       
    37       are not cookie names anymore):
       
    38 
       
    39         * array(0 => `a Cookie instance`, 1 => `another Cookie instance`)
       
    40 
       
    41     * `ResponseHeaderBag::COOKIES_ARRAY` returns a multi-dimensional array:
       
    42 
       
    43         * array(`the domain` => array(`the path` => array(`the cookie name` => `a Cookie instance`)))
       
    44 
       
    45 * Removed the guesser for the Choice constraint as the constraint only knows
       
    46   about the valid keys, and not their values.
       
    47 
       
    48 * The configuration of MonologBundle has been refactored.
       
    49 
       
    50     * Only services are supported for the processors. They are now registered
       
    51       using the `monolog.processor` tag which accept three optionnal attributes:
       
    52 
       
    53         * `handler`: the name of an handler to register it only for a specific handler
       
    54         * `channel`: to register it only for one logging channel (exclusive with `handler`)
       
    55         * `method`: The method used to process the record (`__invoke` is used if not set)
       
    56 
       
    57     * The email_prototype for the `SwiftMailerHandler` only accept a service id now.
       
    58 
       
    59         * Before:
       
    60 
       
    61             email_prototype: @acme_demo.monolog.email_prototype
       
    62 
       
    63         * After:
       
    64 
       
    65             email_prototype: acme_demo.monolog.email_prototype
       
    66 
       
    67           or if you want to use a factory for the prototype:
       
    68 
       
    69             email_prototype:
       
    70                 id:     acme_demo.monolog.email_prototype
       
    71                 method: getPrototype
       
    72 
       
    73 * To avoid security issues, HTTP headers coming from proxies are not trusted
       
    74   anymore by default (like `HTTP_X_FORWARDED_FOR`, `X_FORWARDED_PROTO`, and
       
    75   `X_FORWARDED_HOST`). If your application is behind a reverse proxy, add the
       
    76   following configuration:
       
    77 
       
    78         framework:
       
    79             trust_proxy_headers: true
       
    80 
       
    81 * To avoid hidden naming collisions, the AbstractType does not try to define
       
    82   the name of form types magically. You now need to implement the `getName()`
       
    83   method explicitly when creating a custom type.
       
    84 
       
    85 * Renamed some methods to follow the naming conventions:
       
    86 
       
    87         Session::getAttributes() -> Session::all()
       
    88         Session::setAttributes() -> Session::replace()
       
    89 
       
    90 * {_locale} is not supported in paths in the access_control section anymore. You can
       
    91   rewrite the paths using a regular expression such as "(?:[a-z]{2})".
       
    92 
       
    93 RC3 to RC4
       
    94 ----------
       
    95 
       
    96 * Annotation classes must be annotated with @Annotation
       
    97   (see the validator constraints for examples)
       
    98 
       
    99 * Annotations are not using the PHP autoloading but their own mechanism. This
       
   100   allows much more control about possible failure states. To make your code
       
   101   work, add the following lines at the end of your `autoload.php` file:
       
   102 
       
   103         use Doctrine\Common\Annotations\AnnotationRegistry;
       
   104 
       
   105         AnnotationRegistry::registerLoader(function($class) use ($loader) {
       
   106             $loader->loadClass($class);
       
   107             return class_exists($class, false);
       
   108         });
       
   109 
       
   110         AnnotationRegistry::registerFile(
       
   111             __DIR__.'/../vendor/doctrine/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php'
       
   112         );
       
   113 
       
   114   The `$loader` variable is an instance of `UniversalClassLoader`.
       
   115   Additionally you might have to adjust the ORM path to the
       
   116   `DoctrineAnnotations.php`. If you are not using the `UniversalClassLoader`
       
   117   see the [Doctrine Annotations
       
   118   documentation](http://www.doctrine-project.org/docs/common/2.1/en/reference/annotations.html)
       
   119   for more details on how to register annotations.
       
   120 
       
   121 beta5 to RC1
       
   122 ------------
       
   123 
       
   124 * Renamed `Symfony\Bundle\FrameworkBundle\Command\Command` to
       
   125   `Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand`
       
   126 
       
   127 * Removed the routing `AnnotGlobLoader` class
       
   128 
       
   129 * Some blocks in the Twig Form templates have been renamed to avoid
       
   130   collisions:
       
   131 
       
   132     * `container_attributes` to `widget_container_attributes`
       
   133     * `attributes` to `widget_attributes`
       
   134     * `options` to `widget_choice_options`
       
   135 
       
   136 * Event changes:
       
   137 
       
   138     * All listeners must now be tagged with `kernel.event_listener` instead of
       
   139       `kernel.listener`.
       
   140     * Kernel events are now properly prefixed with `kernel` instead of `core`:
       
   141 
       
   142         * Before:
       
   143 
       
   144                 <tag name="kernel.listener" event="core.request" method="onCoreRequest" />
       
   145 
       
   146         * After:
       
   147 
       
   148                 <tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" />
       
   149 
       
   150         Note: the method can of course remain as `onCoreRequest`, but renaming it
       
   151         as well for consistency with future projects makes sense.
       
   152 
       
   153     * The `Symfony\Component\HttpKernel\CoreEvents` class has been renamed to
       
   154       `Symfony\Component\HttpKernel\KernelEvents`
       
   155 
       
   156 * `TrueValidator` and `FalseValidator` constraints validators no longer accepts any value as valid data.
       
   157 
       
   158 beta4 to beta5
       
   159 --------------
       
   160 
       
   161 * `UserProviderInterface::loadUser()` has been renamed to
       
   162   `UserProviderInterface::refreshUser()` to make the goal of the method
       
   163   clearer.
       
   164 
       
   165 * The `$kernel` property on `WebTestCase` is now static. Change any instances
       
   166   of `$this->kernel` in your functional tests to `self::$kernel`.
       
   167 
       
   168 * The AsseticBundle has been moved to its own repository (it still bundled
       
   169   with Symfony SE).
       
   170 
       
   171 * Yaml Component:
       
   172 
       
   173     * Exception classes have been moved to their own namespace
       
   174     * `Yaml::load()` has been renamed to `Yaml::parse()`
       
   175 
       
   176 * The File classes from `HttpFoundation` have been refactored:
       
   177 
       
   178     * `Symfony\Component\HttpFoundation\File\File` has a new API:
       
   179 
       
   180        * It now extends `\SplFileInfo`:
       
   181 
       
   182            * former `getName()` equivalent is `getBasename()`,
       
   183            * former `getDirectory()` equivalent is `getPath()`,
       
   184            * former `getPath()` equivalent is `getRealPath()`.
       
   185 
       
   186        * the `move()` method now creates the target directory when it does not exist,
       
   187 
       
   188        * `getExtension()` and `guessExtension()` do not return the extension
       
   189           with a leading `.` anymore
       
   190 
       
   191     * `Symfony\Component\HttpFoundation\File\UploadedFile` has a new API:
       
   192 
       
   193         * The constructor has a new Boolean parameter that must be set to true
       
   194           in test mode only in order to be able to move the file. This parameter
       
   195           is not intended to be set to true from outside of the core files.
       
   196 
       
   197         * `getMimeType()` now always returns the mime type of the underlying file.
       
   198            Use `getClientMimeType()` to get the mime type from the request.
       
   199 
       
   200         * `getSize()` now always returns the size of the underlying file.
       
   201            Use `getClientSize()` to get the file size from the request.
       
   202 
       
   203         * Use `getClientOriginalName()` to retrieve the original name from the
       
   204           request.
       
   205 
       
   206 * The `extensions` setting for Twig has been removed. There is now only one
       
   207   way to register Twig extensions, via the `twig.extension` tag.
       
   208 
       
   209 * The stack of Monolog handlers now bubbles the records by default. To stop
       
   210   the propagation you need to configure the bubbling explicitly.
       
   211 
       
   212 * Expanded the `SerializerInterface`, while reducing the number of public
       
   213   methods in the Serializer class itself breaking BC and adding component
       
   214   specific Exception classes.
       
   215 
       
   216 * The `FileType` Form class has been heavily changed:
       
   217 
       
   218     * The temporary storage has been removed.
       
   219 
       
   220     * The file type `type` option has also been removed (the new behavior is
       
   221       the same as when the `type` was set to `file` before).
       
   222 
       
   223     * The file input is now rendered as any other input field.
       
   224 
       
   225 * The `em` option of the Doctrine `EntityType` class now takes the entity
       
   226   manager name instead of the EntityManager instance. If you don't pass this
       
   227   option, the default Entity Manager will be used as before.
       
   228 
       
   229 * In the Console component: `Command::getFullname()` and
       
   230   `Command::getNamespace()` have been removed (`Command::getName()` behavior
       
   231   is now the same as the old `Command::getFullname()`).
       
   232 
       
   233 * Default Twig form templates have been moved to the Twig bridge. Here is how
       
   234   you can reference them now from a template or in a configuration setting:
       
   235 
       
   236     Before:
       
   237 
       
   238         TwigBundle:Form:div_layout.html.twig
       
   239 
       
   240     After:
       
   241 
       
   242         form_div_layout.html.twig
       
   243 
       
   244 * All settings regarding the cache warmers have been removed.
       
   245 
       
   246 * `Response::isRedirected()` has been merged with `Response::isRedirect()`
       
   247 
       
   248 beta3 to beta4
       
   249 --------------
       
   250 
       
   251 * `Client::getProfiler` has been removed in favor of `Client::getProfile`,
       
   252   which returns an instance of `Profile`.
       
   253 
       
   254 * Some `UniversalClassLoader` methods have been renamed:
       
   255 
       
   256     * `registerPrefixFallback` to `registerPrefixFallbacks`
       
   257     * `registerNamespaceFallback` to `registerNamespaceFallbacks`
       
   258 
       
   259 * The event system has been made more flexible. A listener can now be any
       
   260   valid PHP callable.
       
   261 
       
   262     * `EventDispatcher::addListener($eventName, $listener, $priority = 0)`:
       
   263         * `$eventName` is the event name (cannot be an array anymore),
       
   264         * `$listener` is a PHP callable.
       
   265 
       
   266     * The events classes and constants have been renamed:
       
   267 
       
   268         * Old class name `Symfony\Component\Form\Events` and constants:
       
   269 
       
   270                 Events::preBind = 'preBind'
       
   271                 Events::postBind = 'postBind'
       
   272                 Events::preSetData = 'preSetData'
       
   273                 Events::postSetData = 'postSetData'
       
   274                 Events::onBindClientData = 'onBindClientData'
       
   275                 Events::onBindNormData = 'onBindNormData'
       
   276                 Events::onSetData = 'onSetData'
       
   277 
       
   278         * New class name `Symfony\Component\Form\FormEvents` and constants:
       
   279 
       
   280                 FormEvents::PRE_BIND = 'form.pre_bind'
       
   281                 FormEvents::POST_BIND = 'form.post_bind'
       
   282                 FormEvents::PRE_SET_DATA = 'form.pre_set_data'
       
   283                 FormEvents::POST_SET_DATA = 'form.post_set_data'
       
   284                 FormEvents::BIND_CLIENT_DATA = 'form.bind_client_data'
       
   285                 FormEvents::BIND_NORM_DATA = 'form.bind_norm_data'
       
   286                 FormEvents::SET_DATA = 'form.set_data'
       
   287 
       
   288         * Old class name `Symfony\Component\HttpKernel\Events` and constants:
       
   289 
       
   290                 Events::onCoreRequest = 'onCoreRequest'
       
   291                 Events::onCoreException = 'onCoreException'
       
   292                 Events::onCoreView = 'onCoreView'
       
   293                 Events::onCoreController = 'onCoreController'
       
   294                 Events::onCoreResponse = 'onCoreResponse'
       
   295 
       
   296         * New class name `Symfony\Component\HttpKernel\CoreEvents` and constants:
       
   297 
       
   298                 CoreEvents::REQUEST = 'core.request'
       
   299                 CoreEvents::EXCEPTION = 'core.exception'
       
   300                 CoreEvents::VIEW = 'core.view'
       
   301                 CoreEvents::CONTROLLER = 'core.controller'
       
   302                 CoreEvents::RESPONSE = 'core.response'
       
   303 
       
   304         * Old class name `Symfony\Component\Security\Http\Events` and constants:
       
   305 
       
   306                 Events::onSecurityInteractiveLogin = 'onSecurityInteractiveLogin'
       
   307                 Events::onSecuritySwitchUser = 'onSecuritySwitchUser'
       
   308 
       
   309         * New class name `Symfony\Component\Security\Http\SecurityEvents` and constants:
       
   310 
       
   311                 SecurityEvents::INTERACTIVE_LOGIN = 'security.interactive_login'
       
   312                 SecurityEvents::SWITCH_USER = 'security.switch_user'
       
   313 
       
   314     * `addListenerService` now only takes a single event name as its first
       
   315       argument,
       
   316 
       
   317     * Tags in configuration must now set the method to call:
       
   318 
       
   319         * Before:
       
   320 
       
   321                 <tag name="kernel.listener" event="onCoreRequest" />
       
   322 
       
   323         * After:
       
   324 
       
   325                 <tag name="kernel.listener" event="core.request" method="onCoreRequest" />
       
   326 
       
   327     * Subscribers must now always return a hash:
       
   328 
       
   329         * Before:
       
   330 
       
   331                 public static function getSubscribedEvents()
       
   332                 {
       
   333                     return Events::onBindNormData;
       
   334                 }
       
   335 
       
   336         * After:
       
   337 
       
   338                 public static function getSubscribedEvents()
       
   339                 {
       
   340                     return array(FormEvents::BIND_NORM_DATA => 'onBindNormData');
       
   341                 }
       
   342 
       
   343 * Form `DateType` parameter `single-text` changed to `single_text`
       
   344 * Form field label helpers now accepts setting attributes, i.e.:
       
   345 
       
   346 ```html+jinja
       
   347 {{ form_label(form.name, 'Custom label', { 'attr': {'class': 'name_field'} }) }}
       
   348 ```
       
   349 
       
   350 * In order to use Swiftmailer, you should now register its "init.php" file via
       
   351   the autoloader ("app/autoloader.php") and remove the `Swift_` prefix from
       
   352   the autoloader. For an example on how this should be done, see the Standard
       
   353   Distribution
       
   354   [autoload.php](https://github.com/symfony/symfony-standard/blob/v2.0.0BETA4/app/autoload.php#L29).
       
   355 
       
   356 beta2 to beta3
       
   357 --------------
       
   358 
       
   359 * The settings under `framework.annotations` have changed slightly:
       
   360 
       
   361     Before:
       
   362 
       
   363         framework:
       
   364             annotations:
       
   365                 cache: file
       
   366                 file_cache:
       
   367                     debug: true
       
   368                     dir: /foo
       
   369 
       
   370     After:
       
   371 
       
   372         framework:
       
   373             annotations:
       
   374                 cache: file
       
   375                 debug: true
       
   376                 file_cache_dir: /foo
       
   377 
       
   378 beta1 to beta2
       
   379 --------------
       
   380 
       
   381 * The annotation parsing process has been changed (it now uses Doctrine Common
       
   382   3.0). All annotations which are used in a class must now be imported (just
       
   383   like you import PHP namespaces with the "use" statement):
       
   384 
       
   385   Before:
       
   386 
       
   387 ``` php
       
   388 <?php
       
   389 
       
   390 /**
       
   391  * @orm:Entity
       
   392  */
       
   393 class AcmeUser
       
   394 {
       
   395     /**
       
   396      * @orm:Id
       
   397      * @orm:GeneratedValue(strategy = "AUTO")
       
   398      * @orm:Column(type="integer")
       
   399      * @var integer
       
   400      */
       
   401     private $id;
       
   402 
       
   403     /**
       
   404      * @orm:Column(type="string", nullable=false)
       
   405      * @assert:NotBlank
       
   406      * @var string
       
   407      */
       
   408     private $name;
       
   409 }
       
   410 ```
       
   411   After:
       
   412 
       
   413 ``` php
       
   414 <?php
       
   415 
       
   416 use Doctrine\ORM\Mapping as ORM;
       
   417 use Symfony\Component\Validator\Constraints as Assert;
       
   418 
       
   419 /**
       
   420  * @ORM\Entity
       
   421  */
       
   422 class AcmeUser
       
   423 {
       
   424     /**
       
   425      * @ORM\Id
       
   426      * @ORM\GeneratedValue(strategy="AUTO")
       
   427      * @ORM\Column(type="integer")
       
   428      *
       
   429      * @var integer
       
   430      */
       
   431     private $id;
       
   432 
       
   433     /**
       
   434      * @ORM\Column(type="string", nullable=false)
       
   435      * @Assert\NotBlank
       
   436      *
       
   437      * @var string
       
   438      */
       
   439     private $name;
       
   440 }
       
   441 ```
       
   442 
       
   443 * The `Set` constraint has been removed as it is not required anymore.
       
   444 
       
   445 Before:
       
   446 
       
   447 ``` php
       
   448 <?php
       
   449 
       
   450 /**
       
   451  * @orm:Entity
       
   452  */
       
   453 class AcmeEntity
       
   454 {
       
   455     /**
       
   456      * @assert:Set({@assert:Callback(...), @assert:Callback(...)})
       
   457      */
       
   458     private $foo;
       
   459 }
       
   460 ```
       
   461 After:
       
   462 
       
   463 ``` php
       
   464 <?php
       
   465 
       
   466 use Doctrine\ORM\Mapping as ORM;
       
   467 use Symfony\Component\Validator\Constraints\Callback;
       
   468 
       
   469 /**
       
   470  * @ORM\Entity
       
   471  */
       
   472 class AcmeEntity
       
   473 {
       
   474     /**
       
   475      * @Callback(...)
       
   476      * @Callback(...)
       
   477      */
       
   478     private $foo;
       
   479 }
       
   480 ```
       
   481 
       
   482 * The config under `framework.validation.annotations` has been removed and was
       
   483   replaced with a boolean flag `framework.validation.enable_annotations` which
       
   484   defaults to false.
       
   485 
       
   486 * Forms must now be explicitly enabled (automatically done in Symfony SE):
       
   487 
       
   488         framework:
       
   489             form: ~
       
   490 
       
   491     Which is equivalent to:
       
   492 
       
   493         framework:
       
   494             form:
       
   495                 enabled: true
       
   496 
       
   497 * The Routing Exceptions have been moved:
       
   498 
       
   499     Before:
       
   500 
       
   501         Symfony\Component\Routing\Matcher\Exception\Exception
       
   502         Symfony\Component\Routing\Matcher\Exception\NotFoundException
       
   503         Symfony\Component\Routing\Matcher\Exception\MethodNotAllowedException
       
   504 
       
   505     After:
       
   506 
       
   507         Symfony\Component\Routing\Exception\Exception
       
   508         Symfony\Component\Routing\Exception\NotFoundException
       
   509         Symfony\Component\Routing\Exception\MethodNotAllowedException
       
   510 
       
   511 * The form component's `csrf_page_id` option has been renamed to
       
   512   `intention`.
       
   513 
       
   514 * The `error_handler` setting has been removed. The `ErrorHandler` class
       
   515   is now managed directly by Symfony SE in `AppKernel`.
       
   516 
       
   517 * The Doctrine metadata files has moved from
       
   518   `Resources/config/doctrine/metadata/orm/` to `Resources/config/doctrine`,
       
   519   the extension from `.dcm.yml` to `.orm.yml`, and the file name has been
       
   520   changed to the short class name.
       
   521 
       
   522     Before:
       
   523 
       
   524         Resources/config/doctrine/metadata/orm/Bundle.Entity.dcm.xml
       
   525         Resources/config/doctrine/metadata/orm/Bundle.Entity.dcm.yml
       
   526 
       
   527     After:
       
   528 
       
   529         Resources/config/doctrine/Entity.orm.xml
       
   530         Resources/config/doctrine/Entity.orm.yml
       
   531 
       
   532 * With the introduction of a new Doctrine Registry class, the following
       
   533   parameters have been removed (replaced by methods on the `doctrine`
       
   534   service):
       
   535 
       
   536    * `doctrine.orm.entity_managers`
       
   537    * `doctrine.orm.default_entity_manager`
       
   538    * `doctrine.dbal.default_connection`
       
   539 
       
   540     Before:
       
   541 
       
   542         $container->getParameter('doctrine.orm.entity_managers')
       
   543         $container->getParameter('doctrine.orm.default_entity_manager')
       
   544         $container->getParameter('doctrine.orm.default_connection')
       
   545 
       
   546     After:
       
   547 
       
   548         $container->get('doctrine')->getEntityManagerNames()
       
   549         $container->get('doctrine')->getDefaultEntityManagerName()
       
   550         $container->get('doctrine')->getDefaultConnectionName()
       
   551 
       
   552     But you don't really need to use these methods anymore, as to get an entity
       
   553     manager, you can now use the registry directly:
       
   554 
       
   555     Before:
       
   556 
       
   557         $em = $this->get('doctrine.orm.entity_manager');
       
   558         $em = $this->get('doctrine.orm.foobar_entity_manager');
       
   559 
       
   560     After:
       
   561 
       
   562         $em = $this->get('doctrine')->getEntityManager();
       
   563         $em = $this->get('doctrine')->getEntityManager('foobar');
       
   564 
       
   565 * The `doctrine:generate:entities` arguments and options changed. Run
       
   566   `./app/console doctrine:generate:entities --help` for more information about
       
   567   the new syntax.
       
   568 
       
   569 * The `doctrine:generate:repositories` command has been removed. The
       
   570   functionality has been moved to the `doctrine:generate:entities`.
       
   571 
       
   572 * Doctrine event subscribers now use a unique "doctrine.event_subscriber" tag.
       
   573   Doctrine event listeners also use a unique "doctrine.event_listener" tag. To
       
   574   specify a connection, use the optional "connection" attribute.
       
   575 
       
   576     Before:
       
   577 
       
   578         listener:
       
   579             class: MyEventListener
       
   580             tags:
       
   581                 - { name: doctrine.common.event_listener, event: name }
       
   582                 - { name: doctrine.dbal.default_event_listener, event: name }
       
   583         subscriber:
       
   584             class: MyEventSubscriber
       
   585             tags:
       
   586                 - { name: doctrine.common.event_subscriber }
       
   587                 - { name: doctrine.dbal.default_event_subscriber }
       
   588 
       
   589     After:
       
   590 
       
   591         listener:
       
   592             class: MyEventListener
       
   593             tags:
       
   594                 - { name: doctrine.event_listener, event: name }                      # register for all connections
       
   595                 - { name: doctrine.event_listener, event: name, connection: default } # only for the default connection
       
   596         subscriber:
       
   597             class: MyEventSubscriber
       
   598             tags:
       
   599                 - { name: doctrine.event_subscriber }                      # register for all connections
       
   600                 - { name: doctrine.event_subscriber, connection: default } # only for the default connection
       
   601 
       
   602 * Application translations are now stored in the `Resources` directory:
       
   603 
       
   604     Before:
       
   605 
       
   606         app/translations/catalogue.fr.xml
       
   607 
       
   608     After:
       
   609 
       
   610         app/Resources/translations/catalogue.fr.xml
       
   611 
       
   612 * The option `modifiable` of the `collection` form type was split into two
       
   613   options `allow_add` and `allow_delete`.
       
   614 
       
   615     Before:
       
   616 
       
   617         $builder->add('tags', 'collection', array(
       
   618             'type' => 'text',
       
   619             'modifiable' => true,
       
   620         ));
       
   621 
       
   622     After:
       
   623 
       
   624         $builder->add('tags', 'collection', array(
       
   625             'type' => 'text',
       
   626             'allow_add' => true,
       
   627             'allow_delete' => true,
       
   628         ));
       
   629 
       
   630 * `Request::hasSession()` has been renamed to `Request::hasPreviousSession()`. The
       
   631   method `hasSession()` still exists, but only checks if the request contains a
       
   632   session object, not if the session was started in a previous request.
       
   633 
       
   634 * Serializer: The NormalizerInterface's `supports()` method has been split in
       
   635   two methods: `supportsNormalization()` and `supportsDenormalization()`.
       
   636 
       
   637 * `ParameterBag::getDeep()` has been removed, and is replaced with a boolean flag
       
   638   on the `ParameterBag::get()` method.
       
   639 
       
   640 * Serializer: `AbstractEncoder` & `AbstractNormalizer` were renamed to
       
   641   `SerializerAwareEncoder` & `SerializerAwareNormalizer`.
       
   642 
       
   643 * Serializer: The `$properties` argument has been dropped from all interfaces.
       
   644 
       
   645 * Form: Renamed option value `text` of `widget` option of the `date` type was
       
   646   renamed to `single-text`. `text` indicates to use separate text boxes now
       
   647   (like for the `time` type).
       
   648 
       
   649 * Form: Renamed view variable `name` to `full_name`. The variable `name` now
       
   650   contains the local, short name (equivalent to `$form->getName()`).
       
   651 
       
   652 PR12 to beta1
       
   653 -------------
       
   654 
       
   655 * The CSRF secret configuration has been moved to a mandatory global `secret`
       
   656   setting (as the secret is now used for everything and not just CSRF):
       
   657 
       
   658     Before:
       
   659 
       
   660         framework:
       
   661             csrf_protection:
       
   662                 secret: S3cr3t
       
   663 
       
   664     After:
       
   665 
       
   666         framework:
       
   667             secret: S3cr3t
       
   668 
       
   669 * The `File::getWebPath()` and `File::rename()` methods have been removed, as
       
   670   well as the `framework.document_root` configuration setting.
       
   671 
       
   672 * The `File::getDefaultExtension()` method has been renamed to `File::guessExtension()`.
       
   673   The renamed method now returns null if it cannot guess the extension.
       
   674 
       
   675 * The `session` configuration has been refactored:
       
   676 
       
   677   * The `class` option has been removed (use the `session.class` parameter
       
   678     instead);
       
   679 
       
   680   * The PDO session storage configuration has been removed (a cookbook recipe
       
   681     is in the work);
       
   682 
       
   683   * The `storage_id` option now takes a service id instead of just part of it.
       
   684 
       
   685 * The `DoctrineMigrationsBundle` and `DoctrineFixturesBundle` bundles have
       
   686   been moved to their own repositories.
       
   687 
       
   688 * The form framework has been refactored extensively (more information in the
       
   689   documentation).
       
   690 
       
   691 * The `trans` tag does not accept a message as an argument anymore:
       
   692 
       
   693         {% trans "foo" %}
       
   694         {% trans foo %}
       
   695 
       
   696     Use the long version the tags or the filter instead:
       
   697 
       
   698         {% trans %}foo{% endtrans %}
       
   699         {{ foo|trans }}
       
   700 
       
   701     This has been done to clarify the usage of the tag and filter and also to
       
   702     make it clearer when the automatic output escaping rules are applied (see
       
   703     the doc for more information).
       
   704 
       
   705 * Some methods in the DependencyInjection component's `ContainerBuilder` and
       
   706   `Definition` classes have been renamed to be more specific and consistent:
       
   707 
       
   708     Before:
       
   709 
       
   710         $container->remove('my_definition');
       
   711         $definition->setArgument(0, 'foo');
       
   712 
       
   713     After:
       
   714 
       
   715         $container->removeDefinition('my_definition');
       
   716         $definition->replaceArgument(0, 'foo');
       
   717 
       
   718 * In the rememberme configuration, the `token_provider key` now expects a real
       
   719   service id instead of only a suffix.
       
   720 
       
   721 PR11 to PR12
       
   722 ------------
       
   723 
       
   724 * `HttpFoundation\Cookie::getExpire()` was renamed to `getExpiresTime()`
       
   725 
       
   726 * XML configurations have been normalized. All tags with only one attribute
       
   727   have been converted to tag content:
       
   728 
       
   729     Before:
       
   730 
       
   731         <bundle name="MyBundle" />
       
   732         <app:engine id="twig" />
       
   733         <twig:extension id="twig.extension.debug" />
       
   734 
       
   735     After:
       
   736 
       
   737         <bundle>MyBundle</bundle>
       
   738         <app:engine>twig</app:engine>
       
   739         <twig:extension>twig.extension.debug</twig:extension>
       
   740 
       
   741 * Fixes a critical security issue which allowed all users to switch to
       
   742   arbitrary accounts when the SwitchUserListener was activated. Configurations
       
   743   which do not use the SwitchUserListener are not affected.
       
   744 
       
   745 * The Dependency Injection Container now strongly validates the references of
       
   746   all your services at the end of its compilation process. If you have invalid
       
   747   references this will result in a compile-time exception instead of a run-time
       
   748   exception (the previous behavior).
       
   749 
       
   750 PR10 to PR11
       
   751 ------------
       
   752 
       
   753 * Extension configuration classes should now implement the
       
   754   `Symfony\Component\Config\Definition\ConfigurationInterface` interface. Note
       
   755   that the BC is kept but implementing this interface in your extensions will
       
   756   allow for further developments.
       
   757 
       
   758 * The `fingerscrossed` Monolog option has been renamed to `fingers_crossed`.
       
   759 
       
   760 PR9 to PR10
       
   761 -----------
       
   762 
       
   763 * Bundle logical names earned back their `Bundle` suffix:
       
   764 
       
   765     *Controllers*: `Blog:Post:show` -> `BlogBundle:Post:show`
       
   766 
       
   767     *Templates*:   `Blog:Post:show.html.twig` -> `BlogBundle:Post:show.html.twig`
       
   768 
       
   769     *Resources*:   `@Blog/Resources/config/blog.xml` -> `@BlogBundle/Resources/config/blog.xml`
       
   770 
       
   771     *Doctrine*:    `$em->find('Blog:Post', $id)` -> `$em->find('BlogBundle:Post', $id)`
       
   772 
       
   773 * `ZendBundle` has been replaced by `MonologBundle`. Have a look at the
       
   774   changes made to Symfony SE to see how to upgrade your projects:
       
   775   https://github.com/symfony/symfony-standard/pull/30/files
       
   776 
       
   777 * Almost all core bundles parameters have been removed. You should use the
       
   778   settings exposed by the bundle extension configuration instead.
       
   779 
       
   780 * Some core bundles service names changed for better consistency.
       
   781 
       
   782 * Namespace for validators has changed from `validation` to `assert` (it was
       
   783   announced for PR9 but it was not the case then):
       
   784 
       
   785     Before:
       
   786 
       
   787         @validation:NotNull
       
   788 
       
   789     After:
       
   790 
       
   791         @assert:NotNull
       
   792 
       
   793     Moreover, the `Assert` prefix used for some constraints has been removed
       
   794     (`AssertTrue` to `True`).
       
   795 
       
   796 * `ApplicationTester::getDisplay()` and `CommandTester::getDisplay()` method
       
   797   now return the command exit code
       
   798 
       
   799 PR8 to PR9
       
   800 ----------
       
   801 
       
   802 * `Symfony\Bundle\FrameworkBundle\Util\Filesystem` has been moved to
       
   803   `Symfony\Component\HttpKernel\Util\Filesystem`
       
   804 
       
   805 * The `Execute` constraint has been renamed to `Callback`
       
   806 
       
   807 * The HTTP exceptions classes signatures have changed:
       
   808 
       
   809     Before:
       
   810 
       
   811         throw new NotFoundHttpException('Not Found', $message, 0, $e);
       
   812 
       
   813     After:
       
   814 
       
   815         throw new NotFoundHttpException($message, $e);
       
   816 
       
   817 * The RequestMatcher class does not add `^` and `$` anymore to regexp.
       
   818 
       
   819     You need to update your security configuration accordingly for instance:
       
   820 
       
   821     Before:
       
   822 
       
   823         pattern:  /_profiler.*
       
   824         pattern:  /login
       
   825 
       
   826     After:
       
   827 
       
   828         pattern:  ^/_profiler
       
   829         pattern:  ^/login$
       
   830 
       
   831 * Global templates under `app/` moved to a new location (old directory did not
       
   832   work anyway):
       
   833 
       
   834     Before:
       
   835 
       
   836         app/views/base.html.twig
       
   837         app/views/AcmeDemoBundle/base.html.twig
       
   838 
       
   839     After:
       
   840 
       
   841         app/Resources/views/base.html.twig
       
   842         app/Resources/AcmeDemo/views/base.html.twig
       
   843 
       
   844 * Bundle logical names lose their `Bundle` suffix:
       
   845 
       
   846     *Controllers*: `BlogBundle:Post:show` -> `Blog:Post:show`
       
   847 
       
   848     *Templates*:   `BlogBundle:Post:show.html.twig` -> `Blog:Post:show.html.twig`
       
   849 
       
   850     *Resources*:   `@BlogBundle/Resources/config/blog.xml` -> `@Blog/Resources/config/blog.xml`
       
   851 
       
   852     *Doctrine*:    `$em->find('BlogBundle:Post', $id)` -> `$em->find('Blog:Post', $id)`
       
   853 
       
   854 * Assetic filters must be now explicitly loaded:
       
   855 
       
   856         assetic:
       
   857             filters:
       
   858                 cssrewrite: ~
       
   859                 yui_css:
       
   860                     jar:      "/path/to/yuicompressor.jar"
       
   861                 my_filter:
       
   862                     resource: "%kernel.root_dir%/config/my_filter.xml"
       
   863                     foo:      bar