Compare commits

...

39 Commits

Author SHA1 Message Date
Fabien Potencier
8e255a0c55 Merge branch '2.7' into 2.8
* 2.7:
  Increase the inlining YAML level for config:debug
  [Serializer] Minor: fix CS and PHPDoc
  [Form] fix tests
  [Serializer] Ensure that groups are strings
  [Debug] Tell that the extension is for PHP 5 only
  Static code analysis
  Update AnnotationDirectoryLoader.php
  added a test
  Escape the delimiter in Glob::toRegex
  [FrameworkBundle] Fix template location for PHP templates
  [FrameworkBundle] Add path verification to the template parsing test cases
2016-01-27 06:14:19 +01:00
Fabien Potencier
574f6fed54 Merge branch '2.7' into 2.8
* 2.7:
  fixed undefined variable
  Fixed the phpDoc of UserInterface
  fixed APCu dep version
  make apc class loader testable against apcu without apc bc layer
  Added support for the `0.0.0.0/0` trusted proxy
  [DoctrineBridge][Validator] >= 2.3 Pass association instead of ID as argument
  added missing constant
  Added 451 status code
  Remove unnecessary code
  Allow absolute URLs to be displayed in the debug toolbar
  [ClassLoader] Use symfony/polyfill-apcu
  [HttpKernel] Lookup the response even if the lock was released after 2 seconds
2016-01-25 17:29:20 +01:00
Fabien Potencier
142588bc7e fixed CS 2016-01-21 10:24:53 +01:00
Fabien Potencier
9878d595ce Merge branch '2.7' into 2.8
* 2.7:
  fixed CS
  fixed test
  fixed CS
  Remove default match from AbstractConfigCommand::findExtension
2016-01-21 10:05:51 +01:00
Nicolas Grekas
386364a0e7 Merge branch '2.7' into 2.8
* 2.7:
  [Yaml] Fix tests on PHP 7.0.2
  [2.7] Workaround https://bugs.php.net/63206
  [2.3] Workaround https://bugs.php.net/63206
  Add closing parenthesis
  [Serializer] Unset object_to_populate after using it
  [Serializer] Allow to use proxies in object_to_populate
2016-01-13 11:28:07 +01:00
Nicolas Grekas
2673677356 bug #17320 [Debug] Fixed erroneous deprecation notice for extended Interfaces (peterrehm)
This PR was merged into the 2.8 branch.

Discussion
----------

[Debug] Fixed erroneous deprecation notice for extended Interfaces

| Q             | A
| ------------- | ---
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #16643, #16775
| License       | MIT
| Doc PR        | -

Replaces #16775.

Commits
-------

5f4e968 Fixed erroneous deprecation notice for extended Interfaces
2016-01-12 10:07:55 +01:00
Peter Rehm
08688bae7a Fixed erroneous deprecation notice for extended Interfaces 2016-01-11 19:57:09 +01:00
Fabien Potencier
a1de6b7d67 Merge branch '2.7' into 2.8
* 2.7:
  updated copyright year
  Update copyright year
  [2.3] Static Code Analysis for Components
2016-01-03 16:33:41 +01:00
Nicolas Grekas
3b3484aed6 Merge branch '2.7' into 2.8
* 2.7:
  [travis] timeout the sigchild tests at 60s
  CS: Single line comments should use double slashes (//) and not hash (#).
  Do not use HttpKernel Extension when not needed for 2.7
  Do not use HttpKernel Extension when not needed
  bumped Symfony version to 2.7.9
  updated VERSION for 2.7.8
  updated CHANGELOG for 2.7.8
  bumped Symfony version to 2.3.37
  updated VERSION for 2.3.36
  update CONTRIBUTORS for 2.3.36
  updated CHANGELOG for 2.3.36
  Revert "Revert "bug #17052 [2.7] Fixed flatten exception recursion with errors (GrahamCampbell)""
  Revert "bug #17052 [2.7] Fixed flatten exception recursion with errors (GrahamCampbell)"
  use nowdoc instead of heredoc

Conflicts:
	src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
	src/Symfony/Component/HttpKernel/Kernel.php
	src/Symfony/Component/Security/Acl/Dbal/AclProvider.php
	src/Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php
2015-12-28 14:12:56 +01:00
Fabien Potencier
83e51a0e89 Merge branch '2.7' into 2.8
* 2.7:
  [2.7] Fixed flatten exception recursion with errors
  Embedded identifier support
  Also transform inline mappings to objects
  Change the ExtensionInterface load method definition to bo identical to the documentation.
  add and correct armenian translations
  [Config] Fix array sort on normalization in edge case
  [Security] Run tests on all PHP versions
  [Serializer] Make metadata interfaces internal
  [Yaml] fix indented line handling in folded blocks
  improve BrowserKit test coverage p1
2015-12-26 14:37:56 +01:00
Fabien Potencier
d371ecb852 Merge branch '2.7' into 2.8
* 2.7:
  Fixed the wrong source name and the ja translation
  [Debug] fix readme: DebugClassLoader moved to debug itself
  [SecurityBundle] disable the init:acl command if ACL is not used
  [DI] remove useless condition around unset
  [Form] Disabled view data validation if "data_class" is set to null
  [HttpFoundation] Workaround HHVM rewriting HTTP response line
2015-11-27 06:45:55 +01:00
Nicolas Grekas
e5d89401d5 Merge branch '2.7' into 2.8
* 2.7:
  Always enable clock-mock for HttpFoundation
  [ClassLoader] Fix parsing namespace when token_get_all() is missing
  Bug #16343 [Router] Too many Routes ?
  [Debug] Ensure class declarations are loaded only once
2015-11-26 08:00:59 +01:00
Fabien Potencier
441bd03c6d Merge branch '2.7' into 2.8
* 2.7:
  added the new Composer exclude-from-classmap option
  added the new Composer exclude-from-classmap option
  fix expected argument type docblock
  Set back libxml settings after testings.
  fixed Twig deprecation notices
2015-10-30 13:15:42 -07:00
Nicolas Grekas
0c250fd873 [PhpUnit] Auto-register SymfonyTestsListener 2015-10-11 10:29:26 +02:00
Nicolas Grekas
ac4e3baca7 Merge branch '2.7' into 2.8
* 2.7:
  [tests] Use @requires annotation when possible
  [tests] Use @requires annotation when possible
  [ci] Enable collecting and replaying skipped tests
  [Process] Workaround buggy PHP warning
  [Console] Add additional ways to detect OS400 platform
  [Yaml] Allow tabs before comments at the end of a line
  Added more tests for PropertyAccess

Conflicts:
	.travis.yml
	src/Symfony/Bridge/Doctrine/composer.json
	src/Symfony/Bridge/Monolog/composer.json
	src/Symfony/Bridge/ProxyManager/composer.json
	src/Symfony/Bridge/Swiftmailer/composer.json
	src/Symfony/Bridge/Twig/composer.json
	src/Symfony/Bundle/DebugBundle/composer.json
	src/Symfony/Bundle/FrameworkBundle/composer.json
	src/Symfony/Bundle/SecurityBundle/composer.json
	src/Symfony/Bundle/TwigBundle/composer.json
	src/Symfony/Bundle/WebProfilerBundle/composer.json
	src/Symfony/Component/Asset/composer.json
	src/Symfony/Component/BrowserKit/composer.json
	src/Symfony/Component/ClassLoader/composer.json
	src/Symfony/Component/Config/composer.json
	src/Symfony/Component/Console/composer.json
	src/Symfony/Component/CssSelector/composer.json
	src/Symfony/Component/Debug/composer.json
	src/Symfony/Component/DependencyInjection/composer.json
	src/Symfony/Component/DomCrawler/composer.json
	src/Symfony/Component/EventDispatcher/composer.json
	src/Symfony/Component/ExpressionLanguage/composer.json
	src/Symfony/Component/Filesystem/composer.json
	src/Symfony/Component/Finder/composer.json
	src/Symfony/Component/Form/composer.json
	src/Symfony/Component/HttpFoundation/composer.json
	src/Symfony/Component/HttpKernel/composer.json
	src/Symfony/Component/Intl/composer.json
	src/Symfony/Component/Locale/composer.json
	src/Symfony/Component/OptionsResolver/composer.json
	src/Symfony/Component/Process/composer.json
	src/Symfony/Component/PropertyAccess/composer.json
	src/Symfony/Component/Routing/composer.json
	src/Symfony/Component/Security/Acl/composer.json
	src/Symfony/Component/Security/Core/composer.json
	src/Symfony/Component/Security/Csrf/composer.json
	src/Symfony/Component/Security/Http/composer.json
	src/Symfony/Component/Security/composer.json
	src/Symfony/Component/Serializer/composer.json
	src/Symfony/Component/Stopwatch/composer.json
	src/Symfony/Component/Templating/composer.json
	src/Symfony/Component/Translation/Tests/Dumper/IcuResFileDumperTest.php
	src/Symfony/Component/Translation/composer.json
	src/Symfony/Component/Validator/composer.json
	src/Symfony/Component/VarDumper/composer.json
	src/Symfony/Component/Yaml/composer.json
2015-10-10 11:36:22 +02:00
Nicolas Grekas
a688bc1aee [Debug] Deprecate providing $fileLinkFormat as second argument 2015-10-02 18:37:57 +02:00
Tobias Schultze
a4d227fc89 Merge branch '2.7' into 2.8
Conflicts:
	src/Symfony/Component/Console/Application.php
	src/Symfony/Component/Console/Command/Command.php
	src/Symfony/Component/Console/Formatter/OutputFormatter.php
	src/Symfony/Component/Console/Formatter/OutputFormatterStyle.php
	src/Symfony/Component/Console/Input/Input.php
	src/Symfony/Component/Console/Input/InputArgument.php
	src/Symfony/Component/Console/Input/InputDefinition.php
	src/Symfony/Component/Console/Input/InputOption.php
	src/Symfony/Component/Console/Output/OutputInterface.php
	src/Symfony/Component/Console/Output/StreamOutput.php
	src/Symfony/Component/CssSelector/CssSelector.php
	src/Symfony/Component/DependencyInjection/Container.php
	src/Symfony/Component/DependencyInjection/ContainerBuilder.php
	src/Symfony/Component/DependencyInjection/ContainerInterface.php
	src/Symfony/Component/DependencyInjection/Definition.php
	src/Symfony/Component/DependencyInjection/Scope.php
	src/Symfony/Component/DependencyInjection/ScopeInterface.php
	src/Symfony/Component/Validator/Constraints/Currency.php
	src/Symfony/Component/Validator/Constraints/CurrencyValidator.php
2015-09-29 14:32:55 +02:00
Fabien Potencier
795e333a07 Merge branch '2.7' into 2.8
* 2.7:
  [DomCrawler] Invalid uri created from forms if base tag present
  [Console] update param type phpdoc for StreamOutput
  [Console] fix typo in OutputInterface
  Use stderr by default when a specific output is not injected
  [Debug] Fix case mismatch detection
  [HttpKernel] fix broken multiline <esi:remove>
  [DoctrineBridge] Fixed #14840
  [FrameworkBundle] add a suggest for the serializer component
  [Yaml] Fix the parsing of float keys
  [Console] Ensure the console output is only detected as decorated when both stderr and stdout support colors
  [HttpKernel] fix DumpDataCollector compat with Twig 2.0
  Improve exception messages.
  Fix that two DirectoryResources with different patterns would be deduplicated
  Tests fix clockmock
  [WebProfilerBundle] Added tabindex="-1" to not interfer with normal UX
  missing "YAML" in the exception message.
  [Translator][warmup][fallback locales] fixed missing cache file generation.
  [framework-bundle] Add Test for TranslationUpdateCommand
  Use ObjectManager interface instead of EntityManager
2015-09-14 16:15:17 +02:00
Nicolas Grekas
7eac742c45 Merge branch '2.7' into 2.8
* 2.7:
  [Validator] Added Swedish translations
  improve exceptions when parsing malformed files
  Dispatch console.terminate *after* console.exception
2015-09-10 10:08:06 +02:00
Fabien Potencier
be37182729 feature #15521 [Debug] Add BufferingLogger for errors that happen before a proper logger is configured (nicolas-grekas)
This PR was merged into the 2.8 branch.

Discussion
----------

[Debug] Add BufferingLogger for errors that happen before a proper logger is configured

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

This allows catching e.g. deprecations that happen during bootstrapping.

Commits
-------

2a9647d [Debug] Add BufferingLogger for errors that happen before a proper logger is configured
2015-09-10 09:37:44 +02:00
Fabien Potencier
abb3cc00c0 feature #15710 added ExceptionHandler::getHtml() to expose the full HTML of an exception (fabpot)
This PR was merged into the 2.8 branch.

Discussion
----------

added ExceptionHandler::getHtml() to expose the full HTML of an exception

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

`ExceptionHandler::createResponse()` has been deprecated in 2.8 to remove the HttpFoundation dependency on `symfony/debug`. But that breaks Silex which relies on this method. As the `decorate` method is private, there is no way in Silex to upgrade. Instead of making the `decorate()` method public, I propose to add a new `getHtml()` method that returns the exception as a full HTML page.

Commits
-------

4d1d277 added ExceptionHandler::getHtml() to expose the full HTML of an exception
2015-09-07 17:20:04 +02:00
Fabien Potencier
12cca1d12a added ExceptionHandler::getHtml() to expose the full HTML of an exception 2015-09-07 16:37:47 +02:00
Fabien Potencier
3c14966b09 Merge branch '2.7' into 2.8
* 2.7:
  [VarDumper] Fix missing support for dumping PHP7 return type
  [travis] disable symfony_debug ext when deps!=no
  Do not normalize the kernel root directory path (see symfony/symfony#15474).
  Don't trigger deprecation on interfaces
  [Debug] Ignore silencing for deprecations
  [ci] Run minimal versions on appveyor only
  Fix appveyor file
  consistently use str_replace to unify directory separators (remaining)
2015-08-31 14:33:08 +02:00
Nicolas Grekas
183655cd20 [Debug] Add BufferingLogger for errors that happen before a proper logger is configured 2015-08-29 20:00:45 +02:00
Fabien Potencier
e60f254628 Merge branch '2.7' into 2.8
* 2.7:
  [Form] fixed BC-break on grouped choice lists
  [WebProfilerBundle] add import for Twig macro
  made Symfony compatible with both Twig 1.x and 2.x
  [Debug/VarDumper] minor cleanups
  [Form] only use PropertyPath if not already callable
  [Form] fix reworked choice list phpdoc
  [DoctrineBridge][Form] Add old tests to legacy group
  Fixed warning when command alias is longer than command name
  removed _self usage when not needed
  Implement the support of timezone objects in the stub IntlDateFormatter
  typofix - https://github.com/vlajos/misspell_fixer
  make doctrine mappings compiler pass exception message more understandable
  fix debug-ext 003.phpt
  [Yaml] Nested merge keys
  [FrameworkBundle] [Command] removed unused variable.
  [Debug] Enhance DebugClassLoader performance on MacOSX
  Add support for variadic arguments in the GetSetNormalizer
  [DoctrineBridge][Form] Fix IdReader when indexing by primary foreign key
  [DoctrineBridge][Form] Fix EntityChoiceList when indexing by primary foreign key
2015-08-22 09:42:07 +02:00
Nicolas Grekas
e6ce720c14 [Debug] Deprecate ExceptionHandler::createResponse 2015-08-01 08:34:55 +02:00
Nicolas Grekas
dbc26f8adc Merge branch '2.7' into 2.8
* 2.7:
  [Debug] cleanup ExceptionHandlerTest
  bumped Symfony version to 2.7.4
  updated VERSION for 2.7.3
  updated CHANGELOG for 2.7.3
  fixed typo in translation keys
  Fix the return value on error for intl methods returning arrays
  Fix merge
  Fix missing _route parameter notice in RouterListener logging case

Conflicts:
	src/Symfony/Component/Debug/composer.json
	src/Symfony/Component/HttpKernel/Kernel.php
2015-08-01 08:34:21 +02:00
Fabien Potencier
d1114d892a Merge branch '2.7' into 2.8
* 2.7:
  Added 'default' color
  [HttpFoundation] Reload the session after regenerating its id
  [HttpFoundation] Add a test case to confirm a bug in session migration
  [Serializer] Fix ClassMetadata::sleep()
  [2.6] Static Code Analysis for Components and Bundles
  [Finder] Command::addAtIndex() fails with Command instance argument
  [DependencyInjection] Freeze also FrozenParameterBag::remove
  [Twig][Bridge] replaced `extends` with `use` in bootstrap_3_horizontal_layout.html.twig
  fix CS
  fixed CS
  Add a way to reset the singleton
  [Security] allow to use `method` in XML configs
  [Serializer] Fix Groups tests.
  Remove duplicate example
  Remove var not used due to returning early (introduced in 8982c32)
  [Serializer] Fix Groups PHPDoc
  Enhance hhvm test skip message
  fix for legacy asset() with EmptyVersionStrategy
  [Form] Added upgrade notes for #15061
2015-07-09 18:11:14 +02:00
Nicolas Grekas
d904fd23d3 [Debug] Allow throwing from __toString() with return trigger_error($e, E_USER_ERROR); 2015-06-23 20:37:12 +02:00
Nicolas Grekas
0e7189372b Merge branch '2.7' into 2.8
* 2.7:
  [FrameworkBundle] Reuse PropertyAccessor service for ObjectNormalizer
  [VarDumper] Fix dump output for better readability
  [PhpUnitBridge] Enforce @-silencing of deprecation notices according to new policy
2015-06-19 17:09:14 +02:00
Nicolas Grekas
16e951b9c6 Merge branch '2.7' into 2.8
* 2.7: (36 commits)
  [DoctrineBridge] Bypass the db when no valid identifier is provided in ORMQueryBuilderLoader
  [Serializer] Fixed typo in comment
  [Form] Fixed: Filter non-integers when selecting entities by int ID
  Fix merge
  Fix merge
  Add test for HHVM FatalErrors
  [2.6][Debug] Fix fatal-errors handling on HHVM
  [Debug] Fix log level of stacked errors
  [VarDumper] Fix uninitialized id in HtmlDumper
  Fixed fluent interface
  [Console] Fix tests on Windows
  [2.7] Fix unsilenced deprecation notices
  [2.3][Debug] Fix fatal-errors handling on HHVM
  [Debug] fix debug class loader case test on windows
  Standardize the name of the exception variables
  [Debug+VarDumper] Fix handling of PHP7 exception/error model
  Do not trigger deprecation error in ResolveParameterPlaceHoldersPass
  [2.3] Static Code Analysis for Components
  Added a small Upgrade note regarding security.context
  added missing deprecation in CHANGELOG
  ...

Conflicts:
	src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/logger.html.twig
	src/Symfony/Component/HttpKernel/Kernel.php
2015-06-18 18:14:27 +02:00
Fabien Potencier
6f054842fe Merge branch '2.7' into 2.8
* 2.7:
  Fix test name
  fixed CS
  Allow new lines in Messages translated with transchoice() (replacement for #14867)
  [Form] Swap new ChoiceView constructor arguments to ease migrating from the deprecated one
  [2.3] Fix tests on Windows
  [Yaml] remove partial deprecation annotation
  Silence invasive deprecation warnings, opt-in for warnings
  Documenting how to keep option value BC - see #14377

Conflicts:
	src/Symfony/Bridge/Doctrine/composer.json
	src/Symfony/Bridge/Twig/composer.json
2015-06-11 19:27:52 +02:00
Fabien Potencier
36805d83b3 Merge branch '2.7' into 2.8
* 2.7: (95 commits)
  [DependencyInjection] provide better error message when using deprecated configuration options
  [console][TableCell] get cell width without decoration.
  Improve the config validation in TwigBundle
  [VarDumper] Changed tooltip to expand-all keybinding in OS X
  [Bridge\PhpUnit] Fix composer installed phpunit detection
  [VarDumper] Fix generic casters calling order
  [2.7][SecurityBundle] Remove SecurityContext from Compile
  [WebProfilerBundle][logger] added missing deprecation message.
  Fix profiler CSS
  [Security][Acl] enforce string identifiers
  [FrameworkBundle] make `templating.helper.router` service available again for BC reasons
  [BrowserKit] Fix bug when uri starts with http.
  bumped Symfony version to 2.7.1
  updated VERSION for 2.7.0
  updated CHANGELOG for 2.7.0
  bumped Symfony version to 2.6.10
  updated VERSION for 2.6.9
  updated CHANGELOG for 2.6.9
  fixed tests
  bumped Symfony version to 2.3.31
  ...

Conflicts:
	src/Symfony/Bundle/FrameworkBundle/Command/TranslationDebugCommand.php
	src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/logger.html.twig
	src/Symfony/Component/HttpKernel/Kernel.php
	src/Symfony/Component/Translation/Loader/JsonFileLoader.php
2015-06-04 22:21:09 +02:00
Fabien Potencier
eda866deb1 Merge branch '2.7' into 2.8
* 2.7:
  fixed CS
  fixed CS
  fixed CS
  Fix WebProfilerBundle compatiblity with HttpKernel < 2.7
  [Validator] Deprecated PHP7-incompatible constraints and related validators
  [DebugBundle] Allow alternative destination for dumps
  [DebugBundle] Use output mechanism of dumpers instead of echoing
  [DebugBundle] Always collect dumps
  [FrameworkBundle] Applied new styles to the config:debug & config:dump-reference commands
  Fix tests in HHVM
  CS: Pre incrementation/decrementation should be used if possible

Conflicts:
	src/Symfony/Bundle/FrameworkBundle/composer.json
2015-05-15 16:11:12 +02:00
Nicolas Grekas
669bc606aa Merge branch '2.7' into 2.8
* 2.7: (70 commits)
  [travis] Use container-based infrastructure
  [HttpKernel] use ConfigCache::getPath() method when it exists
  [PropertyAccess] Fix setting public property on a class having a magic getter
  [Routing] Display file which contain deprecated option
  ContainerInterface: unused exception dropped
  bumped Symfony version to 2.6.8
  updated VERSION for 2.6.7
  updated CHANGELOG for 2.6.7
  bumped Symfony version to 2.3.29
  updated VERSION for 2.3.28
  update CONTRIBUTORS for 2.3.28
  updated CHANGELOG for 2.3.28
  [Debug] Fixed ClassNotFoundFatalErrorHandlerTest
  [SecurityBundle] use access decision constants in config
  [SecurityBundle] use session auth constants in config
  PhpDoc fix in AbstractRememberMeServices
  [Filesystem] Simplified an if statement
  [SecurityBundle] Use Enum Nodes Instead Of Scalar
  [Debug 2.3] Fix test for PHP7
  [HttpKernel] Check if "symfony/proxy-manager-bridge" package is installed
  ...

Conflicts:
	src/Symfony/Bundle/DebugBundle/composer.json
	src/Symfony/Bundle/FrameworkBundle/Command/ServerRunCommand.php
	src/Symfony/Bundle/FrameworkBundle/Command/TranslationDebugCommand.php
	src/Symfony/Component/Form/README.md
	src/Symfony/Component/Intl/README.md
	src/Symfony/Component/Security/README.md
	src/Symfony/Component/Translation/Loader/CsvFileLoader.php
	src/Symfony/Component/Translation/Loader/IniFileLoader.php
	src/Symfony/Component/Translation/Loader/MoFileLoader.php
	src/Symfony/Component/Translation/Loader/PhpFileLoader.php
	src/Symfony/Component/Translation/Loader/PoFileLoader.php
	src/Symfony/Component/Translation/Loader/YamlFileLoader.php
	src/Symfony/Component/Translation/README.md
	src/Symfony/Component/Translation/Translator.php
	src/Symfony/Component/Validator/README.md
2015-05-12 17:16:46 +02:00
Nicolas Grekas
61caba67a5 Merge branch '2.7' into 2.8
* 2.7:
  [Debug] Fix deprecated use of DebugClassLoader
  Revert "[HttpKernel] Throw a LogicException when kernel.exception does not led to a Response"
  [Validator] Fixed Choice when an empty array is used in the "choices" option
2015-04-24 17:39:02 +02:00
Nicolas Grekas
c73ad1ce4e Merge branch '2.7' into 2.8
* 2.7: (40 commits)
  [Debug] Fix ClassNotFoundFatalErrorHandler candidates lookups
  [2.6][Translator] Extend, refactor and simplify Translator tests.
  Update DebugClassLoader.php
  inject asset packages in assets helper service
  [travis] Do not exclude legacy tests on 2.7
  [HttpFoundation] remove getExtension method
  [2.6][Translation] fix legacy tests.
  [Form] Removed remaining deprecation notices in the test suite
  [Form] Moved deprecation notice triggers to file level
  [Debug] Map PHP errors to LogLevel::CRITICAL
  [Routing][DependencyInjection] Support .yaml extension in YAML loaders
  [DX] improve file loader error for router/other resources in bundle
  [FrameworkBundle] Initialize translator with the default locale.
  [FrameworkBundle] Fix Routing\DelegatingLoader resiliency to fatal errors
  [2.7][Translation] remove duplicate code for loading catalogue.
  [2.6][Translation] remove duplicate code for loading catalogue.
  [HttpKernel] Cleanup ExceptionListener
  CS fixes
  [DependencyInjection] Show better error when the Yaml component is not installed
  [2.3] SCA for Components - reference mismatches
  ...
2015-04-24 09:03:44 +02:00
Fabien Potencier
2b867c246f updated version to 2.8 2015-04-10 10:56:33 +02:00
Fabien Potencier
ee60d22436 Revert "removed 3.0 constraints from 2.7 composer files"
This reverts commit 5503804cf91f4ede81b94b34609653c013139038.
2015-04-10 10:55:07 +02:00
11 changed files with 294 additions and 13 deletions

37
BufferingLogger.php Normal file
View File

@@ -0,0 +1,37 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Debug;
use Psr\Log\AbstractLogger;
/**
* A buffering logger that stacks logs for later.
*
* @author Nicolas Grekas <p@tchwork.com>
*/
class BufferingLogger extends AbstractLogger
{
private $logs = array();
public function log($level, $message, array $context = array())
{
$this->logs[] = array($level, $message, $context);
}
public function cleanLogs()
{
$logs = $this->logs;
$this->logs = array();
return $logs;
}
}

View File

@@ -1,6 +1,13 @@
CHANGELOG
=========
2.8.0
-----
* added BufferingLogger for errors that happen before a proper logger is configured
* allow throwing from `__toString()` with `return trigger_error($e, E_USER_ERROR);`
* deprecate ExceptionHandler::createResponse
2.7.0
-----

View File

@@ -52,9 +52,10 @@ class Debug
// CLI - display errors only if they're not already logged to STDERR
ini_set('display_errors', 1);
}
$handler = ErrorHandler::register();
if (!$displayErrors) {
$handler->throwAt(0, true);
if ($displayErrors) {
ErrorHandler::register(new ErrorHandler(new BufferingLogger()));
} else {
ErrorHandler::register()->throwAt(0, true);
}
DebugClassLoader::enable();

View File

@@ -200,8 +200,25 @@ class DebugClassLoader
@trigger_error(sprintf('The %s class extends %s that is deprecated %s', $name, $parent->name, self::$deprecated[$parent->name]), E_USER_DEPRECATED);
}
$parentInterfaces = array();
$deprecatedInterfaces = array();
if ($parent) {
foreach ($parent->getInterfaceNames() as $interface) {
$parentInterfaces[$interface] = 1;
}
}
foreach ($refl->getInterfaceNames() as $interface) {
if (isset(self::$deprecated[$interface]) && strncmp($ns, $interface, $len) && !($parent && $parent->implementsInterface($interface))) {
if (isset(self::$deprecated[$interface]) && strncmp($ns, $interface, $len)) {
$deprecatedInterfaces[] = $interface;
}
foreach (class_implements($interface) as $interface) {
$parentInterfaces[$interface] = 1;
}
}
foreach ($deprecatedInterfaces as $interface) {
if (!isset($parentInterfaces[$interface])) {
@trigger_error(sprintf('The %s %s %s that is deprecated %s', $name, $refl->isInterface() ? 'interface extends' : 'class implements', $interface, self::$deprecated[$interface]), E_USER_DEPRECATED);
}
}

View File

@@ -97,10 +97,12 @@ class ErrorHandler
private $isRecursive = 0;
private $isRoot = false;
private $exceptionHandler;
private $bootstrappingLogger;
private static $reservedMemory;
private static $stackedErrors = array();
private static $stackedErrorLevels = array();
private static $toStringException = null;
/**
* Same init value as thrownErrors.
@@ -157,6 +159,14 @@ class ErrorHandler
return $handler;
}
public function __construct(BufferingLogger $bootstrappingLogger = null)
{
if ($bootstrappingLogger) {
$this->bootstrappingLogger = $bootstrappingLogger;
$this->setDefaultLogger($bootstrappingLogger);
}
}
/**
* Sets a logger to non assigned errors levels.
*
@@ -170,7 +180,7 @@ class ErrorHandler
if (is_array($levels)) {
foreach ($levels as $type => $logLevel) {
if (empty($this->loggers[$type][0]) || $replace) {
if (empty($this->loggers[$type][0]) || $replace || $this->loggers[$type][0] === $this->bootstrappingLogger) {
$loggers[$type] = array($logger, $logLevel);
}
}
@@ -179,7 +189,7 @@ class ErrorHandler
$levels = E_ALL | E_STRICT;
}
foreach ($this->loggers as $type => $log) {
if (($type & $levels) && (empty($log[0]) || $replace)) {
if (($type & $levels) && (empty($log[0]) || $replace || $log[0] === $this->bootstrappingLogger)) {
$log[0] = $logger;
$loggers[$type] = $log;
}
@@ -202,6 +212,7 @@ class ErrorHandler
{
$prevLogged = $this->loggedErrors;
$prev = $this->loggers;
$flush = array();
foreach ($loggers as $type => $log) {
if (!isset($prev[$type])) {
@@ -220,9 +231,24 @@ class ErrorHandler
throw new \InvalidArgumentException('Invalid logger provided');
}
$this->loggers[$type] = $log + $prev[$type];
if ($this->bootstrappingLogger && $prev[$type][0] === $this->bootstrappingLogger) {
$flush[$type] = $type;
}
}
$this->reRegister($prevLogged | $this->thrownErrors);
if ($flush) {
foreach ($this->bootstrappingLogger->cleanLogs() as $log) {
$type = $log[2]['type'];
if (!isset($flush[$type])) {
$this->bootstrappingLogger->log($log[0], $log[1], $log[2]);
} elseif ($this->loggers[$type][0]) {
$this->loggers[$type][0]->log($this->loggers[$type][1], $log[1], $log[2]);
}
}
}
return $prev;
}
@@ -387,7 +413,10 @@ class ErrorHandler
}
if ($throw) {
if (($this->scopedErrors & $type) && class_exists('Symfony\Component\Debug\Exception\ContextErrorException')) {
if (null !== self::$toStringException) {
$throw = self::$toStringException;
self::$toStringException = null;
} elseif (($this->scopedErrors & $type) && class_exists('Symfony\Component\Debug\Exception\ContextErrorException')) {
// Checking for class existence is a work around for https://bugs.php.net/42098
$throw = new ContextErrorException($this->levels[$type].': '.$message, 0, $type, $file, $line, $context);
} else {
@@ -402,6 +431,47 @@ class ErrorHandler
$throw->errorHandlerCanary = new ErrorHandlerCanary();
}
if (E_USER_ERROR & $type) {
$backtrace = $backtrace ?: $throw->getTrace();
for ($i = 1; isset($backtrace[$i]); ++$i) {
if (isset($backtrace[$i]['function'], $backtrace[$i]['type'], $backtrace[$i - 1]['function'])
&& '__toString' === $backtrace[$i]['function']
&& '->' === $backtrace[$i]['type']
&& !isset($backtrace[$i - 1]['class'])
&& ('trigger_error' === $backtrace[$i - 1]['function'] || 'user_error' === $backtrace[$i - 1]['function'])
) {
// Here, we know trigger_error() has been called from __toString().
// HHVM is fine with throwing from __toString() but PHP triggers a fatal error instead.
// A small convention allows working around the limitation:
// given a caught $e exception in __toString(), quitting the method with
// `return trigger_error($e, E_USER_ERROR);` allows this error handler
// to make $e get through the __toString() barrier.
foreach ($context as $e) {
if (($e instanceof \Exception || $e instanceof \Throwable) && $e->__toString() === $message) {
if (1 === $i) {
// On HHVM
$throw = $e;
break;
}
self::$toStringException = $e;
return true;
}
}
if (1 < $i) {
// On PHP (not on HHVM), display the original error message instead of the default one.
$this->handleException($throw);
// Stop the process by giving back the error to the native handler.
return false;
}
}
}
}
throw $throw;
}

View File

@@ -39,6 +39,8 @@ class ExceptionHandler
public function __construct($debug = true, $charset = null, $fileLinkFormat = null)
{
if (false !== strpos($charset, '%')) {
@trigger_error('Providing $fileLinkFormat as second argument to '.__METHOD__.' is deprecated since version 2.8 and will be unsupported in 3.0. Please provide it as third argument, after $charset.', E_USER_DEPRECATED);
// Swap $charset and $fileLinkFormat for BC reasons
$pivot = $fileLinkFormat;
$fileLinkFormat = $charset;
@@ -164,6 +166,7 @@ class ExceptionHandler
$response = $this->createResponse($exception);
$response->sendHeaders();
$response->sendContent();
@trigger_error(sprintf("The %s::createResponse method is deprecated since 2.8 and won't be called anymore when handling an exception in 3.0.", $reflector->class), E_USER_DEPRECATED);
return;
}
@@ -177,7 +180,7 @@ class ExceptionHandler
* This method uses plain PHP functions like header() and echo to output
* the response.
*
* @param \Exception|FlattenException $exception An \Exception instance
* @param \Exception|FlattenException $exception An \Exception or FlattenException instance
*/
public function sendPhpResponse($exception)
{
@@ -199,17 +202,37 @@ class ExceptionHandler
/**
* Creates the error Response associated with the given Exception.
*
* @param \Exception|FlattenException $exception An \Exception instance
* @param \Exception|FlattenException $exception An \Exception or FlattenException instance
*
* @return Response A Response instance
*
* @deprecated since 2.8, to be removed in 3.0.
*/
public function createResponse($exception)
{
@trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
if (!$exception instanceof FlattenException) {
$exception = FlattenException::create($exception);
}
return Response::create($this->getHtml($exception), $exception->getStatusCode(), $exception->getHeaders())->setCharset($this->charset);
}
/**
* Gets the full HTML content associated with the given exception.
*
* @param \Exception|FlattenException $exception An \Exception or FlattenException instance
*
* @return string The HTML content as a string
*/
public function getHtml($exception)
{
if (!$exception instanceof FlattenException) {
$exception = FlattenException::create($exception);
}
return Response::create($this->decorate($this->getContent($exception), $this->getStylesheet($exception)), $exception->getStatusCode(), $exception->getHeaders())->setCharset($this->charset);
return $this->decorate($this->getContent($exception), $this->getStylesheet($exception));
}
/**

View File

@@ -203,6 +203,28 @@ class DebugClassLoaderTest extends \PHPUnit_Framework_TestCase
);
}
public function testInterfaceExtendsDeprecatedInterface()
{
set_error_handler(function () { return false; });
$e = error_reporting(0);
trigger_error('', E_USER_NOTICE);
class_exists('Test\\'.__NAMESPACE__.'\\NonDeprecatedInterfaceClass', true);
error_reporting($e);
restore_error_handler();
$lastError = error_get_last();
unset($lastError['file'], $lastError['line']);
$xError = array(
'type' => E_USER_NOTICE,
'message' => '',
);
$this->assertSame($xError, $lastError);
}
public function testDeprecatedSuperInSameNamespace()
{
set_error_handler(function () { return false; });
@@ -289,6 +311,8 @@ class ClassLoader
eval('namespace Test\\'.__NAMESPACE__.'; class DeprecatedParentClass extends \\'.__NAMESPACE__.'\Fixtures\DeprecatedClass {}');
} elseif ('Test\\'.__NAMESPACE__.'\DeprecatedInterfaceClass' === $class) {
eval('namespace Test\\'.__NAMESPACE__.'; class DeprecatedInterfaceClass implements \\'.__NAMESPACE__.'\Fixtures\DeprecatedInterface {}');
} elseif ('Test\\'.__NAMESPACE__.'\NonDeprecatedInterfaceClass' === $class) {
eval('namespace Test\\'.__NAMESPACE__.'; class NonDeprecatedInterfaceClass implements \\'.__NAMESPACE__.'\Fixtures\NonDeprecatedInterface {}');
} elseif ('Test\\'.__NAMESPACE__.'\Float' === $class) {
eval('namespace Test\\'.__NAMESPACE__.'; class Float {}');
}

View File

@@ -13,6 +13,7 @@ namespace Symfony\Component\Debug\Tests;
use Psr\Log\LogLevel;
use Symfony\Component\Debug\ErrorHandler;
use Symfony\Component\Debug\BufferingLogger;
use Symfony\Component\Debug\Exception\ContextErrorException;
/**
@@ -268,6 +269,33 @@ class ErrorHandlerTest extends \PHPUnit_Framework_TestCase
}
}
public function testHandleUserError()
{
try {
$handler = ErrorHandler::register();
$handler->throwAt(0, true);
$e = null;
$x = new \Exception('Foo');
try {
$f = new Fixtures\ToStringThrower($x);
$f .= ''; // Trigger $f->__toString()
} catch (\Exception $e) {
}
$this->assertSame($x, $e);
restore_error_handler();
restore_exception_handler();
} catch (\Exception $e) {
restore_error_handler();
restore_exception_handler();
throw $e;
}
}
public function testHandleDeprecation()
{
$that = $this;
@@ -372,6 +400,49 @@ class ErrorHandlerTest extends \PHPUnit_Framework_TestCase
}
}
public function testBootstrappingLogger()
{
$bootLogger = new BufferingLogger();
$handler = new ErrorHandler($bootLogger);
$loggers = array(
E_DEPRECATED => array($bootLogger, LogLevel::INFO),
E_USER_DEPRECATED => array($bootLogger, LogLevel::INFO),
E_NOTICE => array($bootLogger, LogLevel::WARNING),
E_USER_NOTICE => array($bootLogger, LogLevel::WARNING),
E_STRICT => array($bootLogger, LogLevel::WARNING),
E_WARNING => array($bootLogger, LogLevel::WARNING),
E_USER_WARNING => array($bootLogger, LogLevel::WARNING),
E_COMPILE_WARNING => array($bootLogger, LogLevel::WARNING),
E_CORE_WARNING => array($bootLogger, LogLevel::WARNING),
E_USER_ERROR => array($bootLogger, LogLevel::CRITICAL),
E_RECOVERABLE_ERROR => array($bootLogger, LogLevel::CRITICAL),
E_COMPILE_ERROR => array($bootLogger, LogLevel::CRITICAL),
E_PARSE => array($bootLogger, LogLevel::CRITICAL),
E_ERROR => array($bootLogger, LogLevel::CRITICAL),
E_CORE_ERROR => array($bootLogger, LogLevel::CRITICAL),
);
$this->assertSame($loggers, $handler->setLoggers(array()));
$handler->handleError(E_DEPRECATED, 'Foo message', __FILE__, 123, array());
$expectedLog = array(LogLevel::INFO, 'Foo message', array('type' => E_DEPRECATED, 'file' => __FILE__, 'line' => 123, 'level' => error_reporting()));
$logs = $bootLogger->cleanLogs();
unset($logs[0][2]['stack']);
$this->assertSame(array($expectedLog), $logs);
$bootLogger->log($expectedLog[0], $expectedLog[1], $expectedLog[2]);
$mockLogger = $this->getMock('Psr\Log\LoggerInterface');
$mockLogger->expects($this->once())
->method('log')
->with(LogLevel::WARNING, 'Foo message', $expectedLog[2]);
$handler->setLoggers(array(E_DEPRECATED => array($mockLogger, LogLevel::WARNING)));
}
public function testHandleFatalError()
{
try {

View File

@@ -0,0 +1,7 @@
<?php
namespace Symfony\Component\Debug\Tests\Fixtures;
interface NonDeprecatedInterface extends DeprecatedInterface
{
}

View File

@@ -0,0 +1,24 @@
<?php
namespace Symfony\Component\Debug\Tests\Fixtures;
class ToStringThrower
{
private $exception;
public function __construct(\Exception $e)
{
$this->exception = $e;
}
public function __toString()
{
try {
throw $this->exception;
} catch (\Exception $e) {
// Using user_error() here is on purpose so we do not forget
// that this alias also should work alongside with trigger_error().
return user_error($e, E_USER_ERROR);
}
}
}

View File

@@ -23,8 +23,8 @@
"symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
},
"require-dev": {
"symfony/class-loader": "~2.2",
"symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2"
"symfony/class-loader": "~2.2|~3.0.0",
"symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2|~3.0.0"
},
"autoload": {
"psr-4": { "Symfony\\Component\\Debug\\": "" },
@@ -35,7 +35,7 @@
"minimum-stability": "dev",
"extra": {
"branch-alias": {
"dev-master": "2.7-dev"
"dev-master": "2.8-dev"
}
}
}