Commit Graph

1226 Commits

Author SHA1 Message Date
Fabien Potencier
940c29abec minor #21926 [Routing] Optimised dumped matcher (frankdejonge)
This PR was squashed before being merged into the 3.3-dev branch (closes #21926).

Discussion
----------

[Routing] Optimised dumped matcher

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | -
| License       | MIT
| Doc PR        | -

TL;DR: I've optimised the PhpMatcherDumper output for a <del>60x</del> 4.4x performance improvement on a collection of ~800 routes by inducing cyclomatic complexity.

[EDIT] The 60x performance boost was only visible when profiling with blackfire, which is quite possibly a result of the cost of profiling playing a part. After doing some more profiling the realistic benefit of the optimisation is more likely to be in the ranges is 1.3x to 4.4x.

After the previous optimisation I began looking at how the PrefixCollection was adding its performance boost. I spotted another way to do this, which has the same theory behind it (excluding groups based on prefixes). The current implementation only groups when one prefix resides in the other. In this new implementation I've created a way to detect common prefixes, which allows for much more efficient grouping. Every time a route is added to the group it'll either merge into an existing group, merge into a new group with a route that has a common prefix, or merge into a new group with an existing group that has a common prefix.

However, when a parameter is present grouping must only be done AFTER that route, this case is accounted for. In all other cases, where there's no collision routes can be grouped freely because if a group was matched other groups wouldn't have matched.

After all the groups are created the groups are optimised. Groups with fewer than 3 children are inlined into the parent group. This is because a group with 2 children would potentially result in 3 prefix checks while if they are inlines it's 2 checks.

Like with the previous optimisation I've profiled this using blackfire. But the match function didn't show up anymore. I've added `usleep` calls in the dumped matcher during profiling, which made it show up again. I've verified with @simensen that this is because the wall time of the function was too small for it to be of any interest. When it DID get detected, because of more tasks running, it would show up with around 250 nanoseconds. In comparison, the previous speed improvement brought the wall time down from 7ms to ~2.5ms on a set of ~800 routes.

Because of the altered grouping behaviour I've not modified the PrefixCollection but I've created a new StaticPrefixCollection and updated the PhpMatcherDumper to use that instead.

Commits
-------

449b6912dc [Routing] Optimised dumped matcher
2017-03-22 12:45:31 -07:00
Frank de Jonge
449b6912dc [Routing] Optimised dumped matcher 2017-03-22 12:45:25 -07:00
Jáchym Toušek
0043653ea8 [DoctrineBridge][Routing] Require PSR-11 container instead of Symfony container 2017-03-12 08:32:31 -07:00
Christian Flothmann
3c5d9155d4 deprecate implicit string casting of mapping keys 2017-03-06 20:18:14 +01:00
Robin Chalas
32be16b239 Move RoutingResolverPass to the Routing component 2017-03-05 16:12:05 +01:00
Fabien Potencier
255b645d1b feature #21824 Add deprecation note on routing class parameters (lepiaf)
This PR was merged into the 3.3-dev branch.

Discussion
----------

Add deprecation note on routing class parameters

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | no
| BC breaks?    | no
| Deprecations? | yes
| Tests pass?   | yes
| Fixed tickets | https://github.com/symfony/symfony/issues/21735
| License       | MIT
| Doc PR        | no

Create PR with note about deprecation of class parameters.

https://github.com/symfony/symfony/pull/21739#issuecomment-283413593

Commits
-------

5b0641ebe1 Add deprecation note on routing class parameters
2017-03-04 07:01:34 -08:00
Jakub Zalas
344114024b
[Router] Follow symlinks and skip dots in the annotation directory loader
This will make it consistent with other loaders.
2017-03-03 16:02:38 +01:00
Robin Chalas
6f84877138 [Routing] Fix AnnotationDirectionLoaderTest 2017-03-03 10:58:26 +01:00
Fabien Potencier
1a957100c2 Merge branch '3.2'
* 3.2:
  [Config] removed obsolete code
  [Form] Improve rounding precision
  [Routing] Ignore hidden directories when loading routes from annotations
  fixed CS
2017-03-02 13:35:04 -08:00
Fabien Potencier
6aa87febf0 [Config] removed obsolete code 2017-03-02 07:58:09 -08:00
Fabien Potencier
e1558cc042 Merge branch '2.8' into 3.2
* 2.8:
  [Form] Improve rounding precision
  [Routing] Ignore hidden directories when loading routes from annotations
2017-03-02 07:57:24 -08:00
Fabien Potencier
db38c6f629 Merge branch '2.7' into 2.8
* 2.7:
  [Form] Improve rounding precision
  [Routing] Ignore hidden directories when loading routes from annotations
2017-03-02 07:56:34 -08:00
Jakub Zalas
ce9df0237c
[Routing] Ignore hidden directories when loading routes from annotations 2017-03-02 14:51:26 +00:00
Thierry Thuon
5b0641ebe1 Add deprecation note on routing class parameters 2017-03-01 21:50:23 +01:00
Fabien Potencier
4a70919cea feature #21723 [Routing][DX] Add full route definition for invokable controller/class (yceruto)
This PR was merged into the 3.3-dev branch.

Discussion
----------

[Routing][DX] Add full route definition for invokable controller/class

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| License       | MIT
| Doc PR        | _not yet_

Currently the [`@Route`][1] annotation can be set on the class (for global parameters only). This PR allows you to define the full route annotation for _single_ controllers on the class.

Here a common use case of [ADR pattern][3] applied to Symfony:

**Before:**
```
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

/**
 * @Route(service="AppBundle\Controller\Hello")
 */
class Hello
{
    private $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @Route("/hello/{name}", name="hello")
     */
    public function __invoke($name = 'World')
    {
        $this->logger->info('log entry...');

        return new Response(sprintf('Hello %s!', $name));
    }
}
```

**After:**
```
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

/**
 * @Route("/hello/{name}", name="hello", service="AppBundle\Controller\Hello")
 */
class Hello
{
    private $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function __invoke($name = 'World')
    {
        $this->logger->info('log entry...');

        return new Response(sprintf('Hello %s!', $name));
    }
}
```

This feature does not break any behavior before and works under these conditions:
 * The class cannot contain other methods with `@Route` annotation (otherwise, this works as before: used for global parameters).
 *  <del>The class `@Route` must have the `name` option defined (otherwise, the route is ignored).</del> This one is auto-generated if `null`.
 * The class must be invokable: [`__invoke()` method][2] (otherwise, the route is ignored).

Btw, this PR fix the inconsistency with other route definitions (xml, yml) where the `_controller` parameter points to the class name only (i.e. without method).

  [1]: https://github.com/symfony/symfony/tree/master/src/Symfony/Component/Routing/Annotation/Route.php
  [2]: http://php.net/manual/en/language.oop5.magic.php#object.invoke
  [3]: https://github.com/pmjones/adr

Commits
-------

34e360ade3 Add full route definition to invokable class
2017-02-28 13:57:59 -08:00
Frank de Jonge
dd647ffc8a [Routing] Optimised dumped router matcher, prevent unneeded function calls. 2017-02-28 12:11:03 -08:00
Yonel Ceruto
34e360ade3 Add full route definition to invokable class 2017-02-23 11:32:28 -05:00
Nicolas Grekas
e28f6b44e5 Merge branch '3.2'
* 3.2:
  Refactored other PHPUnit method calls to work with namespaced PHPUnit 6
  Refactored other PHPUnit method calls to work with namespaced PHPUnit 6
  Further refactorings to PHPUnit namespaces
  resolve parameters in definition classes
2017-02-21 11:07:34 +01:00
Nicolas Grekas
5fc3589381 Merge branch '2.8' into 3.2
* 2.8:
  Refactored other PHPUnit method calls to work with namespaced PHPUnit 6
  Further refactorings to PHPUnit namespaces
  resolve parameters in definition classes
2017-02-21 10:12:04 +01:00
Nicolas Grekas
13fff761a7 Merge branch '2.7' into 2.8
* 2.7:
  Further refactorings to PHPUnit namespaces
  resolve parameters in definition classes
2017-02-21 09:33:48 +01:00
Peter Rehm
de8106fea6 Further refactorings to PHPUnit namespaces 2017-02-21 09:32:25 +01:00
Nicolas Grekas
2f20a6ceea Merge branch '3.2'
* 3.2:
  Updated PHPUnit namespaces
2017-02-20 13:38:57 +01:00
Nicolas Grekas
95f30de91d Merge branch '2.8' into 3.2
* 2.8:
  Updated PHPUnit namespaces
2017-02-20 13:38:41 +01:00
Nicolas Grekas
f2754ebe53 minor #21663 Updated PHPUnit namespaces (peterrehm)
This PR was squashed before being merged into the 2.8 branch (closes #21663).

Discussion
----------

Updated PHPUnit namespaces

| Q             | A
| ------------- | ---
| Branch?       | 2.8
| Bug fix?      | no
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | -
| License       | MIT
| Doc PR        | -

Follow Up of #21564

Commits
-------

205ced4 Updated PHPUnit namespaces
2017-02-20 13:35:45 +01:00
Peter Rehm
205ced409b Updated PHPUnit namespaces 2017-02-20 13:35:43 +01:00
Fabien Potencier
0e1596df25 fixed Composer constraints 2017-02-18 11:13:35 -08:00
Fabien Potencier
245eaa8fa2 fixed Composer constraints 2017-02-18 10:28:08 -08:00
Nicolas Grekas
7a618fbd5f Merge branch '3.2'
* 3.2:
  Fix typo in process error message
  Update to PHPUnit namespaces
  Minor typo fix messsagesData -> messagesData
  remove translation data collector when not usable
2017-02-18 18:35:19 +01:00
Nicolas Grekas
66cad2e4c5 Merge branch '2.8' into 3.2
* 2.8:
  Update to PHPUnit namespaces
  Minor typo fix messsagesData -> messagesData
  remove translation data collector when not usable
2017-02-18 18:28:00 +01:00
Nicolas Grekas
33bae93a44 Merge branch '2.7' into 2.8
* 2.7:
  Update to PHPUnit namespaces
  remove translation data collector when not usable
2017-02-18 18:06:33 +01:00
Fabien Potencier
025585d5e8 added support for glob loaders in Config 2017-02-18 08:06:39 -08:00
Peter Rehm
ddd2dff9b2 Update to PHPUnit namespaces 2017-02-18 08:02:39 -08:00
Fabien Potencier
033c41a6b9 minor #21090 Secure unserialize by restricting allowed classes when using PHP 7 (dbrumann)
This PR was merged into the 3.3-dev branch.

Discussion
----------

Secure unserialize by restricting allowed classes when using PHP 7

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | ---
| License       | MIT
| Doc PR        | ---

While playing around with Symfony in a PHP 7.1 application I noticed a warning in how EnvParameterResoure uses unserialize. Since PHP 7.0 introduced the options argument which allows to restrict which classes can be unserialized for better security, it might make sense to use it here. As far as I can tell this is no BC break, it only provides an additional safety mechanism.

Commits
-------

b4201810b9 Conditionally add options to unserialize in PHP 7.0+.
2017-02-12 20:14:59 +01:00
Fabien Potencier
9f3072c416 Merge branch '3.2'
* 3.2:
  fixed typo
  fixed composer.json
  [HttpKernel] Fix Bundle name regression
  always check for all fields to be mapped
  clarify exception when no args are configured
  [PropertyAccess] Handle interfaces in the invalid argument exception
  [DI] Fix defaults overriding empty strings in AutowirePass
  [Debug] Workaround "null" $context
  [Debug] Remove $context arg from handleError(), preparing for PHP 7.2
  [FrameworkBundle] Dont wire "annotations.cached_reader" before removing passes
  [Routing] Fix BC break in AnnotationClassLoader defaults attributes handling
  Fix tests with ICU 57.1
  Fix the condition checking the minimum ICU version
2017-01-27 18:39:08 -08:00
Fabien Potencier
09d5f4eb72 Merge branch '3.1' into 3.2
* 3.1:
  fixed typo
  fixed composer.json
  always check for all fields to be mapped
  clarify exception when no args are configured
  [PropertyAccess] Handle interfaces in the invalid argument exception
  [DI] Fix defaults overriding empty strings in AutowirePass
  [Debug] Workaround "null" $context
  [Debug] Remove $context arg from handleError(), preparing for PHP 7.2
  [Routing] Fix BC break in AnnotationClassLoader defaults attributes handling
  Fix tests with ICU 57.1
  Fix the condition checking the minimum ICU version
2017-01-27 18:37:08 -08:00
Fabien Potencier
e8895ad102 Merge branch '2.8' into 3.1
* 2.8:
  always check for all fields to be mapped
  clarify exception when no args are configured
  [PropertyAccess] Handle interfaces in the invalid argument exception
  [DI] Fix defaults overriding empty strings in AutowirePass
  [Debug] Workaround "null" $context
  [Debug] Remove $context arg from handleError(), preparing for PHP 7.2
  [Routing] Fix BC break in AnnotationClassLoader defaults attributes handling
  Fix tests with ICU 57.1
  Fix the condition checking the minimum ICU version
2017-01-27 16:04:57 -08:00
Fabien Potencier
791b143914 Merge branch '2.7' into 2.8
* 2.7:
  always check for all fields to be mapped
  clarify exception when no args are configured
  [PropertyAccess] Handle interfaces in the invalid argument exception
  [Debug] Workaround "null" $context
  [Debug] Remove $context arg from handleError(), preparing for PHP 7.2
  [Routing] Fix BC break in AnnotationClassLoader defaults attributes handling
  Fix tests with ICU 57.1
  Fix the condition checking the minimum ICU version
2017-01-27 15:54:58 -08:00
Robin Chalas
1d298f0417
[Routing] Fix BC break in AnnotationClassLoader defaults attributes handling 2017-01-23 21:38:04 +01:00
Fabien Potencier
c633f912d8 Merge branch '3.2'
* 3.2: (40 commits)
  fixed CS
  fixed CS
  fixed CS fixer config
  fixed typo
  Revert "fixed typo"
  fixed typo
  fixed CS
  Avoid setting request attributes from signature arguments in AnnotationClassLoader
  [DependencyInjection] Add some missing typehints in YamlFileLoader
  [DependencyInjection] minor: Fix a DocBlock
  [HttpKernel] Give higher priority to adding request formats
  [Cache] Fix tags expiration
  [PhpUnit] Blacklist DeprecationErrorHandler in stack traces
  [PropertyInfo] Don't try to access a property thru a static method
  [PropertyInfo] Exclude static methods form properties guessing
  [Workflow] Added new validator to make sure each place has unique translation names
  [Cache] [PdoAdapter] Fix MySQL 1170 error (blob as primary key)
  [FrameworkBundle] Fix third level headers for MarkdownDescriptor
  [Ldap] Using Ldap stored username instead of form submitted one
  [Ldap] load users with the good username case
  ...
2017-01-21 09:10:26 -08:00
Fabien Potencier
ebdbd96449 Merge branch '3.1' into 3.2
* 3.1: (31 commits)
  fixed CS
  fixed CS
  fixed CS fixer config
  fixed typo
  Revert "fixed typo"
  fixed typo
  fixed CS
  Avoid setting request attributes from signature arguments in AnnotationClassLoader
  [DependencyInjection] Add some missing typehints in YamlFileLoader
  [DependencyInjection] minor: Fix a DocBlock
  [HttpKernel] Give higher priority to adding request formats
  [PropertyInfo] Don't try to access a property thru a static method
  [PropertyInfo] Exclude static methods form properties guessing
  [FrameworkBundle] Fix third level headers for MarkdownDescriptor
  [Ldap] Using Ldap stored username instead of form submitted one
  [Ldap] load users with the good username case
  [DoctrineBridge] Fixed invalid unique value as composite key
  [Doctrine Bridge] fix UniqueEntityValidator for composite object primary keys
  [TwigBundle] do not lose already set method calls
  #20411 fix Yaml parsing for very long quoted strings
  ...
2017-01-21 09:06:35 -08:00
Fabien Potencier
20bdaa6cc5 Merge branch '2.8' into 3.1
* 2.8: (26 commits)
  fixed CS
  fixed CS
  fixed CS fixer config
  fixed typo
  Revert "fixed typo"
  fixed typo
  fixed CS
  Avoid setting request attributes from signature arguments in AnnotationClassLoader
  [DependencyInjection] Add some missing typehints in YamlFileLoader
  [DependencyInjection] minor: Fix a DocBlock
  [HttpKernel] Give higher priority to adding request formats
  [PropertyInfo] Don't try to access a property thru a static method
  [PropertyInfo] Exclude static methods form properties guessing
  [FrameworkBundle] Fix third level headers for MarkdownDescriptor
  [TwigBundle] do not lose already set method calls
  #20411 fix Yaml parsing for very long quoted strings
  CS: apply is_null
  DX: remove invalid inheritdoc
  bumped Symfony version to 2.8.17
  updated VERSION for 2.8.16
  ...
2017-01-21 09:01:39 -08:00
Fabien Potencier
a784d5c01f Merge branch '2.7' into 2.8
* 2.7:
  fixed typo
  Revert "fixed typo"
  fixed typo
  fixed CS
  Avoid setting request attributes from signature arguments in AnnotationClassLoader
  [DependencyInjection] Add some missing typehints in YamlFileLoader
  [DependencyInjection] minor: Fix a DocBlock
  [HttpKernel] Give higher priority to adding request formats
  [FrameworkBundle] Fix third level headers for MarkdownDescriptor
  [TwigBundle] do not lose already set method calls
  #20411 fix Yaml parsing for very long quoted strings
  CS: apply is_null
  DX: remove invalid inheritdoc
  bumped Symfony version to 2.7.24
  updated VERSION for 2.7.23
  update CONTRIBUTORS for 2.7.23
  updated CHANGELOG for 2.7.23
  [FrameworkBundle] Skip test if xdebug.file_link_format is defined.
2017-01-21 08:40:50 -08:00
Fabien Potencier
735d0a6ce7 Revert "fixed typo"
This reverts commit 6830d9f4c9.
2017-01-21 08:37:26 -08:00
Fabien Potencier
6830d9f4c9 fixed typo 2017-01-21 08:33:48 -08:00
Robin Chalas
d3fa8a1859 Avoid setting request attributes from signature arguments in AnnotationClassLoader 2017-01-19 17:02:55 +01:00
Fabien Potencier
f71c699289 Merge branch '3.2'
* 3.2:
  updated LICENSE year
  updated LICENSE year
  updated LICENSE year
  Fixed `@return self` with `$this`
  [Yaml] add missing indicator character
2017-01-02 12:33:09 -08:00
Fabien Potencier
3f4e6cce8c Merge branch '3.1' into 3.2
* 3.1:
  updated LICENSE year
  updated LICENSE year
  Fixed `@return self` with `$this`
2017-01-02 12:32:22 -08:00
Fabien Potencier
d05e9e03cb Merge branch '2.8' into 3.1
* 2.8:
  updated LICENSE year
  updated LICENSE year
  Fixed `@return self` with `$this`
2017-01-02 12:31:54 -08:00
Fabien Potencier
ed70281d49 Merge branch '2.7' into 2.8
* 2.7:
  updated LICENSE year
  Fixed `@return self` with `$this`
2017-01-02 12:30:24 -08:00
Fabien Potencier
9879c8193f updated LICENSE year 2017-01-02 12:30:00 -08:00