Compare commits

...

112 Commits

Author SHA1 Message Date
reecefowell
075070230c Silence invasive deprecation warnings, opt-in for warnings 2015-06-08 10:37:21 +01:00
Fabien Potencier
1df2971b27 Merge branch '2.6' into 2.7
* 2.6: (30 commits)
  [Translation] fixed JSON loader on PHP 7 when file is empty
  Fix typo
  Check instance of FormBuilderInterface instead of FormBuilder
  [Security] TokenBasedRememberMeServices test to show why encoding username is required
  [Security] AbstractRememberMeServices::encodeCookie() validates cookie parts
  fixed typo
  [console][formater] allow format toString object.
  [HttpFoundation] Fix baseUrl when script filename is contained in pathInfo
  Avoid redirection to XHR URIs
  [HttpFoundation] IpUtils::checkIp4() should allow  networks
  [2.6] Fix HTML escaping of to-source links
  Fix HTML escaping of to-source links
  ExceptionHandler: More Encoding
  Fix the rendering of deprecation log messages
  [FrameworkBundle] Removed unnecessary parameter in TemplateController
  [DomCrawler] Throw an exception if a form field path is incomplete.
  Fixed the indentation in the compiled template for the DumpNode
  [Console] Delete duplicate test in CommandTest
  [TwigBundle] Refresh twig paths when resources change.
  WebProfiler break words
  ...

Conflicts:
	src/Symfony/Bridge/Twig/composer.json
	src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/logger.html.twig
	src/Symfony/Component/Debug/ExceptionHandler.php
2015-05-22 16:54:25 +02:00
Fabien Potencier
4851a041c4 fixed typo 2015-05-20 15:09:45 +02:00
Nicolas Grekas
366f3fe9ea [2.6] Fix HTML escaping of to-source links 2015-05-19 17:48:49 -07:00
Alexander Menk
d59aecf5f4 ExceptionHandler: More Encoding 2015-05-19 17:33:46 -07:00
Fabien Potencier
366a668f66 Merge branch '2.6' into 2.7
* 2.6:
  [DebugBundle] Allow alternative destination for dumps
  [DebugBundle] Use output mechanism of dumpers instead of echoing
  [DebugBundle] Always collect dumps
  Fix tests in HHVM
  CS: Pre incrementation/decrementation should be used if possible

Conflicts:
	src/Symfony/Component/Finder/Expression/Glob.php
2015-05-15 15:33:16 +02:00
Fabien Potencier
c214e92851 Merge branch '2.3' into 2.6
* 2.3:
  Fix tests in HHVM
  CS: Pre incrementation/decrementation should be used if possible

Conflicts:
	src/Symfony/Bundle/TwigBundle/Command/LintCommand.php
	src/Symfony/Component/Console/Helper/TableHelper.php
	src/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php
	src/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php
	src/Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategy.php
	src/Symfony/Component/Security/Acl/Dbal/AclProvider.php
	src/Symfony/Component/Security/Http/RememberMe/TokenBasedRememberMeServices.php
2015-05-15 15:32:45 +02:00
Fabien Potencier
dfe71c73cf minor #14121 CS: Pre incrementation/decrementation should be used if possible (gharlan)
This PR was merged into the 2.3 branch.

Discussion
----------

CS: Pre incrementation/decrementation should be used if possible

| 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

Fixes provided by new fixer: https://github.com/FriendsOfPHP/PHP-CS-Fixer/pull/1113

If this pr is merged I would change the level of the fixer to `symfony`.

Commits
-------

c5123d6 CS: Pre incrementation/decrementation should be used if possible
2015-05-15 15:28:34 +02:00
Fabien Potencier
7c6eebd9df Merge branch '2.6' into 2.7
* 2.6: (21 commits)
  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
  [Translation] simplify getMessages.
  [Framework][Translation] added test for debug command.
  Run tests on hhvm instead of hhvm-nightly
  Use HTTPS in README and some other fixes
  add more entropy to generated classnames
  ...

Conflicts:
	.travis.yml
	src/Symfony/Component/HttpKernel/Kernel.php
2015-05-11 04:35:29 +02:00
Alexander Schwenn
ad4511a8fd [Debug] Fixed ClassNotFoundFatalErrorHandlerTest 2015-05-08 15:17:44 +02:00
Nicolas Grekas
8bc9390ba3 [Debug 2.3] Fix test for PHP7 2015-05-06 12:13:27 +02:00
Javier Spagnoletti
d7b0e6d455 [2.7] [minor] [DebugClassLoader] Minor update in deprecation message
| Q             | A
| ------------- | ---
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | n/a
| License       | MIT
| Doc PR        | n/a

Minor update for PHP version reference in deprecation message.

Before:
```
Test\Symfony\Component\Debug\Tests\Float uses a reserved class name (Float) that will break on PHP 7.0
```

After:
```
Test\Symfony\Component\Debug\Tests\Float uses a reserved class name (Float) that will break on PHP 7+
```
2015-05-04 09:57:47 -03:00
Fabien Potencier
fcc1957a6a Merge branch '2.6' into 2.7
* 2.6: (25 commits)
  [2.6] link to https://symfony.com where possible
  Do not override PHP constants, only use when available
  link to https://symfony.com where possible
  [FrameworkBundle] Added missing log in server:run command
  [Finder] Only use GLOB_BRACE when available
  [HttpFoundation] Allow curly braces in trusted host patterns
  Fix merge
  Fix typo in variable name
  [profiler][security] check authenticated user by tokenClass instead of username.
  [WebProfiler] fix html syntax for input types
  [TwigBundle] Fix deprecated use of FlattenException
  [DependencyInjection] Removed extra strtolower calls
  Use https://symfony.com/search for searching
  [Debug] PHP7 compatibility with BaseException
  [Validator] Fixed Choice when an empty array is used in the "choices" option
  Fixed tests
  [StringUtil] Fixed singularification of 'selfies'
  Fix Portuguese (Portugal) translation for Security
  improved exception when missing required component
  [DependencyInjection] resolve circular reference
  ...

Conflicts:
	src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/config.html.twig
	src/Symfony/Component/Form/README.md
	src/Symfony/Component/Intl/README.md
	src/Symfony/Component/Security/README.md
	src/Symfony/Component/Translation/README.md
	src/Symfony/Component/Validator/README.md
2015-05-02 17:21:08 +02:00
Fabien Potencier
572006675e Merge branch '2.3' into 2.6
* 2.3:
  link to https://symfony.com where possible
  [FrameworkBundle] Added missing log in server:run command
  [HttpFoundation] Allow curly braces in trusted host patterns
  [profiler][security] check authenticated user by tokenClass instead of username.
  Use https://symfony.com/search for searching

Conflicts:
	src/Symfony/Bundle/FrameworkBundle/Test/WebTestCase.php
	src/Symfony/Component/Form/README.md
	src/Symfony/Component/Intl/README.md
	src/Symfony/Component/Routing/composer.json
	src/Symfony/Component/Security/README.md
	src/Symfony/Component/Translation/README.md
	src/Symfony/Component/Validator/README.md
2015-05-02 17:18:45 +02:00
Christian Flothmann
95a5aa2b72 link to https://symfony.com where possible 2015-05-01 16:06:45 +02:00
Nicolas Grekas
4bed42658c [Debug] Trigger deprecation notices when using PHP7 reserved class names 2015-04-28 19:35:02 +02:00
Nicolas Grekas
289e4e76fd [Debug] PHP7 compatibility with BaseException 2015-04-26 11:08:32 +02:00
Nicolas Grekas
32665233b1 Merge branch '2.6' into 2.7
* 2.6:
  [Debug] Fix deprecated use of DebugClassLoader
  [Validator] Fixed Choice when an empty array is used in the "choices" option
2015-04-24 17:36:44 +02:00
Nicolas Grekas
c1dc68518c [Debug] Fix deprecated use of DebugClassLoader 2015-04-24 12:55:50 +02:00
Nicolas Grekas
7318d7473c Merge branch '2.6' into 2.7
* 2.6:
  [Debug] Fix ClassNotFoundFatalErrorHandler candidates lookups
  [2.6][Translator] Extend, refactor and simplify Translator tests.

Conflicts:
	src/Symfony/Component/Debug/Tests/FatalErrorHandler/ClassNotFoundFatalErrorHandlerTest.php
	src/Symfony/Component/Translation/Tests/TranslatorCacheTest.php
2015-04-24 09:02:30 +02:00
Nicolas Grekas
cd19fabc2a [Debug] Fix ClassNotFoundFatalErrorHandler candidates lookups 2015-04-23 10:57:12 +02:00
Moritz Kraft
9d22a48de5 Update DebugClassLoader.php
Using name property of ReflectionClass instance in strncmp instead of __toString() return value, the latter seemed to breaking one of hte vendor bundles we use, and it seems fine now with the former.
2015-04-20 18:36:32 +01:00
Fabien Potencier
5437529190 bug #14397 [Debug] Map PHP errors to LogLevel::CRITICAL (nicolas-grekas)
This PR was merged into the 2.7 branch.

Discussion
----------

[Debug] Map PHP errors to LogLevel::CRITICAL

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

See https://github.com/Seldaek/monolog#log-levels for reference.
This is #14294 on 2.7 (not 2.6)

Commits
-------

1dcfbdd [Debug] Map PHP errors to LogLevel::CRITICAL
2015-04-19 18:55:37 +02:00
Nicolas Grekas
fff6a5af15 Merge branch '2.6' into 2.7
* 2.6:
  [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.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
  [Debug] Scream as LogLevel::DEBUG (but for fatal errors / uncaught exceptions)
  [2.3] Static Code Analysis for Components
  [WebProfilerBundle] Fix resiliency to exceptions thrown by the url generator
  [Translation] LoggingTranslator simplifications
  [Translation][fixed test] refresh cache when resources are no longer fresh.
  [FrameworkBundle] Fixed server:start --router relative path issue #14124
  [FrameworkBundle] improve usage of Table helper
  [Validator] Added missing Simplified Chinese (zh_CN) translations
  [FrameworkBundle] Workaround php -S ignoring auto_prepend_file

Conflicts:
	src/Symfony/Bundle/FrameworkBundle/Tests/Translation/TranslatorTest.php
	src/Symfony/Component/Console/Helper/Table.php
	src/Symfony/Component/Translation/LoggingTranslator.php
2015-04-18 17:11:06 +02:00
Nicolas Grekas
eb7564c66d Merge branch '2.3' into 2.6
* 2.3:
  [Routing][DependencyInjection] Support .yaml extension in YAML loaders
  [DX] improve file loader error for router/other resources in bundle
  [FrameworkBundle] Fix Routing\DelegatingLoader resiliency to fatal errors
  [HttpKernel] Cleanup ExceptionListener
  CS fixes
  [DependencyInjection] Show better error when the Yaml component is not installed
  [2.3] SCA for Components - reference mismatches
  [2.3] Static Code Analysis for Components
  [Translation][fixed test] refresh cache when resources are no longer fresh.
  [Validator] Added missing Simplified Chinese (zh_CN) translations
  [FrameworkBundle] Workaround php -S ignoring auto_prepend_file

Conflicts:
	src/Symfony/Bundle/FrameworkBundle/Tests/Translation/TranslatorTest.php
	src/Symfony/Component/Config/Exception/FileLoaderLoadException.php
	src/Symfony/Component/Console/Descriptor/TextDescriptor.php
	src/Symfony/Component/Console/Helper/TableHelper.php
	src/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php
	src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
	src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php
	src/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php
	src/Symfony/Component/HttpKernel/Tests/Debug/TraceableEventDispatcherTest.php
	src/Symfony/Component/PropertyAccess/PropertyAccessor.php
	src/Symfony/Component/Yaml/Tests/InlineTest.php
2015-04-18 17:02:51 +02:00
Nicolas Grekas
ca2dbceeec [Debug] Map PHP errors to LogLevel::CRITICAL 2015-04-18 12:16:04 +02:00
Dariusz Ruminski
9cd1287f00 CS fixes 2015-04-16 09:01:03 +02:00
Nicolas Grekas
8f9d6bcc9b [Debug] Scream as LogLevel::DEBUG (but for fatal errors / uncaught exceptions) 2015-04-15 16:47:26 +02:00
Tobias Schultze
8e6c46832d adjust phpdoc for class not found handler 2015-04-12 00:21:29 +02:00
Jordi Boggiano
340e9f7086 Add psr-4 support to the ClassNotFoundFatalErrorHandler 2015-04-11 23:38:33 +02:00
Tobias Schultze
ab5aea541c Use PSR-4 everywhere instead of PSR-0 2015-04-11 23:38:32 +02:00
Fabien Potencier
ff5b42fa46 removed 3.0 constraints from 2.7 composer files 2015-04-10 09:23:38 +02:00
Fabien Potencier
bbf75b3d76 Merge branch '2.6' into 2.7
* 2.6:
  [Form] Fixed DateType/TimeType that were broken since 849fb2998485639d253e2438ecf78f62cc833a53 and 1c4a75a00a86df3e17979be86bddaafc108daf98
  [Debug] Skip unsilencing test on PHP7
  [Profiler][Logger] fixed cycle odd/even.
2015-04-08 07:28:20 +02:00
Gregor Harlan
01c8bc9bac CS: Pre incrementation/decrementation should be used if possible 2015-04-07 19:54:22 +02:00
Nicolas Grekas
c39932e3e4 [Debug] Skip unsilencing test on PHP7 2015-04-06 10:42:23 +02:00
Nicolas Grekas
10aa489e84 [Debug] Updated CHANGELOG 2015-04-03 17:33:45 +02:00
Nicolas Grekas
989a4d5289 [Debug] Use symfony_debug_backtrace() in FatalErrorException when available 2015-04-03 17:33:45 +02:00
Nicolas Grekas
a627f26c13 [Debug] Add debug extension to the test suite 2015-04-03 17:33:45 +02:00
Julien Pauli
aa08d8e590 [Debug] Add symfony_debug_backtrace() that works with fatal errors 2015-04-03 17:33:43 +02:00
Nicolas Grekas
e350320216 Merge branch '2.6' into 2.7
* 2.6: (24 commits)
  [HttpKernel] Embed the original exception as previous to bounced exceptions
  [Enhancement] netbeans - force interactive shell when limited detection
  [FrameworkBundle] fixes displaying of deprecation notices.
  Revert "Added missing changelog entry"
  [Debug] Tweak docblocks
  [Debug] Rework a bit the PHP doc
  Added missing changelog entry
  [StringUtil] Fixed singularification of 'movies'
  [Debug] Renamed "context" key to "scope_vars" to avoid any ambiguity
  Fix some phpdocs for Twig extensions & templating helpers
  [Debug] Made code in ErrorHandler easier to read
  Use specialized config methods instead of the generic ifTrue() method
  Fix the AJAX profiling
  bumped Symfony version to 2.6.7
  updated VERSION for 2.6.6
  updated CHANGELOG for 2.6.6
  Safe escaping of fragments for eval()
  bumped Symfony version to 2.3.28
  updated VERSION for 2.3.27
  update CONTRIBUTORS for 2.3.27
  ...

Conflicts:
	src/Symfony/Component/Debug/ErrorHandler.php
	src/Symfony/Component/HttpKernel/Kernel.php
2015-04-03 17:24:01 +02:00
Nicolas Grekas
2b8d1207a7 [Debug] Tweak docblocks 2015-04-03 09:48:36 +02:00
Grégoire Pineau
21e1aa2ed7 [Debug] Rework a bit the PHP doc 2015-04-03 09:46:34 +02:00
Grégoire Pineau
76df7e93ea [Debug] Renamed "context" key to "scope_vars" to avoid any ambiguity 2015-04-02 21:18:30 +02:00
Grégoire Pineau
d6953fe635 [Debug] Updated the default log level when a PHP error occurs
According to https://github.com/Seldaek/monolog#log-levels
the level `NOTICE` means "Normal but significant events".

So when a PHP notice occurs, it's not a "normal" event,
but an error.

That's why all PHP errors should use at lease the `WARNING` error
level.
2015-04-02 16:54:44 +02:00
Grégoire Pineau
4bd15a76de [Debug] Made code in ErrorHandler easier to read 2015-04-02 15:40:50 +02:00
Fabien Potencier
a893909a50 Merge branch '2.6' into 2.7
* 2.6:
  Fix small coding style
  [2.3] Static Code Analysis for Components
  [Form] fixed phpdoc
  CS: Convert double quotes to single quotes
  Fixed MongoODM entity loader. Improved loading behavior of entities and documents by reusing entity loader.
  [Validator] added Japanese translation for unmatched charset (id: 80)
  [WebProfilerBundle] fixed undefined buttons.
  [WebProfilerBundle] Fix javascript toolbar on IE8
  [DependencyInjection] Highest precedence for user parameters
  bumped Symfony version to 2.6.6
  [Translation][MoFileLoader] fixed load empty translation.
  updated VERSION for 2.6.5
  updated CHANGELOG for 2.6.5
  bumped Symfony version to 2.3.27
  updated VERSION for 2.3.26
  update CONTRIBUTORS for 2.3.26
  updated CHANGELOG for 2.3.26
  [HttpKernel] UriSigner::buildUrl - default params for http_build_query

Conflicts:
	src/Symfony/Bridge/Propel1/Tests/DataCollector/PropelDataCollectorTest.php
	src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
	src/Symfony/Component/HttpKernel/Kernel.php
	src/Symfony/Component/Security/Http/Firewall/AbstractPreAuthenticatedListener.php
	src/Symfony/Component/Validator/Resources/translations/validators.ja.xlf
2015-03-22 17:57:18 +01:00
Fabien Potencier
d49a46a20a Merge branch '2.3' into 2.6
* 2.3:
  Fix small coding style
  [2.3] Static Code Analysis for Components
  [Form] fixed phpdoc
  CS: Convert double quotes to single quotes
  Fixed MongoODM entity loader. Improved loading behavior of entities and documents by reusing entity loader.
  [Validator] added Japanese translation for unmatched charset (id: 80)
  [DependencyInjection] Highest precedence for user parameters
  [Translation][MoFileLoader] fixed load empty translation.
  bumped Symfony version to 2.3.27
  updated VERSION for 2.3.26
  update CONTRIBUTORS for 2.3.26
  updated CHANGELOG for 2.3.26

Conflicts:
	src/Symfony/Bundle/FrameworkBundle/Command/AssetsInstallCommand.php
	src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php
	src/Symfony/Bundle/TwigBundle/Command/LintCommand.php
	src/Symfony/Component/Config/Definition/ReferenceDumper.php
	src/Symfony/Component/Debug/ExceptionHandler.php
	src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
	src/Symfony/Component/DependencyInjection/Tests/Compiler/MergeExtensionConfigurationPassTest.php
	src/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php
	src/Symfony/Component/Filesystem/Filesystem.php
	src/Symfony/Component/HttpKernel/DataCollector/DataCollector.php
	src/Symfony/Component/HttpKernel/Kernel.php
	src/Symfony/Component/Serializer/Encoder/XmlEncoder.php
	src/Symfony/Component/Translation/PluralizationRules.php
	src/Symfony/Component/Validator/Constraints/IssnValidator.php
	src/Symfony/Component/Validator/Resources/translations/validators.ja.xlf
	src/Symfony/Component/Yaml/Tests/InlineTest.php
2015-03-22 17:55:57 +01:00
Dariusz Ruminski
796dd4cd11 CS: Convert double quotes to single quotes 2015-03-21 12:11:30 +01:00
Nicolas Grekas
081206a6a6 [2.7] add @group legacy 2015-03-13 18:50:01 +01:00
Nicolas Grekas
10b98f6f47 Merge branch '2.6' into 2.7
* 2.6:
  [2.6] add @group legacy
  [2.3] add @group legacy

Conflicts:
	src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/LegacyUniqueEntityValidator2Dot4ApiTest.php
	src/Symfony/Bridge/Propel1/Tests/Form/ChoiceList/ModelChoiceListTest.php
	src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/LegacyFormValidator2Dot4ApiTest.php
	src/Symfony/Component/Security/Core/Tests/Validator/Constraints/LegacyUserPasswordValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyAllValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyBlankValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyCallbackValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyCardSchemeValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyChoiceValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyCollectionValidatorArray2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyCollectionValidatorArrayObject2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyCollectionValidatorCustomArrayObject2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyCountValidatorArray2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyCountValidatorCountable2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyCurrencyValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyDateTimeValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyDateValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyEmailValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyEqualToValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyExpressionValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyFalseValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyFileValidatorObject2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyFileValidatorPath2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyGreaterThanOrEqualValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyGreaterThanValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyIbanValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyIdenticalToValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyImageValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyIpValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyIsbnValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyIssnValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyLanguageValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyLengthValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyLessThanOrEqualValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyLessThanValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyLocaleValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyLuhnValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyNotBlankValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyNotEqualToValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyNotIdenticalToValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyNotNullValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyNullValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyRangeValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyRegexValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyTimeValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyTrueValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyTypeValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyUrlValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/Constraints/LegacyUuidValidator2Dot4ApiTest.php
	src/Symfony/Component/Validator/Tests/ValidatorBuilderTest.php
2015-03-13 18:40:40 +01:00
Nicolas Grekas
5c1570dea1 [2.6] add @group legacy 2015-03-13 18:37:22 +01:00
Nicolas Grekas
ff4124e238 Merge branch '2.6' into 2.7
* 2.6:
  [Debug] reintroduce charset param to ExceptionHandler
2015-03-12 15:45:07 +01:00
Fabien Potencier
62962eb4a5 bug #13899 [Debug] deprecate protected ExceptionHandler::utf8Htmlize (nicolas-grekas)
This PR was merged into the 2.7 branch.

Discussion
----------

[Debug] deprecate protected ExceptionHandler::utf8Htmlize

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

Commits
-------

132b3b1 [Debug] deprecate ExceptionHandler::utf8Htmlize
2015-03-12 15:33:21 +01:00
Fabien Potencier
b8e722662e Merge branch '2.6' into 2.7
* 2.6:
  [HttpFoundation] MongoDbSessionHandler::read() now checks for valid session age
  Changed visibility of setUp() and tearDown to protected
  [WebProfilerBundle] Set debug+charset on the ExceptionHandler fallback
  Added default button class
  used HTML5 meta charset tag and removed hardcoded ones
  Revert "bug #13715 Enforce UTF-8 charset for core controllers (WouterJ)"
  fixed XSS in the exception handler
  Php Inspections (EA Extended) - static code analysis includes:
  [2.3] Remove most refs uses
  Test with local components instead of waiting for the subtree-splitter when possible

Conflicts:
	.travis.yml
2015-03-12 15:31:07 +01:00
Fabien Potencier
a6dd8ca51d Merge branch '2.3' into 2.6
* 2.3:
  [HttpFoundation] MongoDbSessionHandler::read() now checks for valid session age
  [WebProfilerBundle] Set debug+charset on the ExceptionHandler fallback
  used HTML5 meta charset tag and removed hardcoded ones
  Revert "bug #13715 Enforce UTF-8 charset for core controllers (WouterJ)"

Conflicts:
	src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php
	src/Symfony/Bundle/WebProfilerBundle/Controller/ProfilerController.php
	src/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php
	src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php
2015-03-12 15:30:42 +01:00
Fabien Potencier
3e889e0489 bug #13901 [Bundle] Fix charset config (nicolas-grekas, bamarni)
This PR was merged into the 2.3 branch.

Discussion
----------

[Bundle] Fix charset config

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

This reverts #13715 and resurrects #7532, which was fine.

Commits
-------

ef41059 [WebProfilerBundle] Set debug+charset on the ExceptionHandler fallback
cbd0525 used HTML5 meta charset tag and removed hardcoded ones
6ca7fc9 Revert "bug #13715 Enforce UTF-8 charset for core controllers (WouterJ)"
2015-03-12 15:23:35 +01:00
Nicolas Grekas
692ba4b3dd [Debug] reintroduce charset param to ExceptionHandler 2015-03-12 11:30:29 +01:00
Nicolas Grekas
95db75835d Merge branch '2.3' into 2.6
* 2.3:
  Changed visibility of setUp() and tearDown to protected
  fixed XSS in the exception handler
  Php Inspections (EA Extended) - static code analysis includes:
  [2.3] Remove most refs uses
  Test with local components instead of waiting for the subtree-splitter when possible

Conflicts:
	src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php
	src/Symfony/Component/Config/Util/XmlUtils.php
	src/Symfony/Component/Console/Helper/ProgressHelper.php
	src/Symfony/Component/Debug/ExceptionHandler.php
	src/Symfony/Component/Debug/Tests/ErrorHandlerTest.php
	src/Symfony/Component/Filesystem/Tests/FilesystemTest.php
	src/Symfony/Component/OptionsResolver/Options.php
	src/Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php
	src/Symfony/Component/Yaml/Inline.php
2015-03-12 11:28:44 +01:00
sarah khalil
dfb9bf2e04 Changed visibility of setUp() and tearDown to protected 2015-03-11 19:52:02 +01:00
Nicolas Grekas
29a6fd38f3 [WebProfilerBundle] Set debug+charset on the ExceptionHandler fallback 2015-03-11 17:56:24 +01:00
Nicolas Grekas
4d5f8b35d0 [Debug] deprecate ExceptionHandler::utf8Htmlize 2015-03-11 17:29:23 +01:00
Fabien Potencier
712c58246b fixed XSS in the exception handler 2015-03-10 14:08:39 +01:00
Nicolas Grekas
ee04626994 Merge branch '2.3' into 2.6
* 2.3:
  Minor hot fix
  [PROCESS] make sure /dev/tty is readable
  [2.3] require-dev PHPUnit bridge
  [FrameworkBundle] Fixed Shell logo
  [2.3] Update CONTRIBUTING.md
  [2.3][Process] Fixed PhpProcess::getCommandLine() result
  [Console] explicit assertion for ArgvInput::getFirstArgument() with no arguments
  Enforce UTF-8 charset for core controllers

Conflicts:
	CONTRIBUTING.md
	src/Symfony/Bridge/Monolog/composer.json
	src/Symfony/Bundle/FrameworkBundle/composer.json
	src/Symfony/Bundle/SecurityBundle/composer.json
	src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php
	src/Symfony/Bundle/WebProfilerBundle/Controller/ProfilerController.php
	src/Symfony/Component/Console/composer.json
	src/Symfony/Component/Debug/composer.json
	src/Symfony/Component/DomCrawler/composer.json
	src/Symfony/Component/EventDispatcher/composer.json
	src/Symfony/Component/HttpFoundation/composer.json
	src/Symfony/Component/Security/composer.json
	src/Symfony/Component/Templating/composer.json
2015-02-24 12:52:21 +01:00
Nicolas Grekas
4ba2bda995 [2.3] require-dev PHPUnit bridge 2015-02-24 11:24:26 +01:00
Nicolas Grekas
4d9fd69c90 [Debug] Deprecations exception for Symfony internals 2015-02-23 16:12:01 +01:00
Nicolas Grekas
134fad1b92 [PhpUnitBridge] Tweak and fix deprecation notices 2015-02-22 12:48:16 +01:00
Nicolas Grekas
b622a3752d [PhpUnitBridge] new bridge for testing with PHPUnit 2015-02-18 11:38:04 +01:00
Nicolas Grekas
49231a9696 [Debug] generalize deprecated interfaces tracking 2015-02-12 13:00:00 +01:00
Fabien Potencier
4ec60561dd Merge branch '2.6' into 2.7
* 2.6: (21 commits)
  [FrameworkBundle] Fix title and placeholder rendering in php form templates.
  [TwigBridge] Removed duplicated code from TwigRenderer
  [Translator][Logging] implement TranslatorBagInterface.
  RequestDataCollector - small fix
  renamed composer.phar to composer to be consistent with the Symfony docs
  [FrameworkBundle] bumped min version of Routing to 2.3
  removed composer --dev option everywhere
  fixed a test
  [Console] Fixed output bug, if escaped string in a formatted string.
  “console help” ignores --raw option
  Fix form icon position in web profiler
  [Security] Remove ContextListener's onKernelResponse listener as it is used
  Revert "minor #12652 [HttpFoundation] [Hackday] #9942 test: Request::getContent() for null value (skler)"
  Revert "fixed assertion"
  fixed assertion
  [HttpFoundation] [Hackday] #9942 test: Request::getContent() for null value
  fixed URL
  Add reference to documentation in FormEvents phpdocs
  [YAML] Fix one-liners to work with multiple new lines
  Keep "pre" meaning for var_dump quick-and-dirty debug
  ...

Conflicts:
	src/Symfony/Bridge/Twig/composer.json
	src/Symfony/Bundle/FrameworkBundle/composer.json
	src/Symfony/Component/Security/Http/Firewall/ContextListener.php
	src/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php
2015-02-11 08:17:51 +01:00
Fabien Potencier
0a45b2cdbf Merge branch '2.3' into 2.6
* 2.3:
  [FrameworkBundle] Fix title and placeholder rendering in php form templates.
  RequestDataCollector - small fix
  renamed composer.phar to composer to be consistent with the Symfony docs
  [FrameworkBundle] bumped min version of Routing to 2.3
  removed composer --dev option everywhere
  fixed a test
  [Console] Fixed output bug, if escaped string in a formatted string.
  [Security] Remove ContextListener's onKernelResponse listener as it is used
  Revert "minor #12652 [HttpFoundation] [Hackday] #9942 test: Request::getContent() for null value (skler)"
  Revert "fixed assertion"
  fixed assertion
  [HttpFoundation] [Hackday] #9942 test: Request::getContent() for null value
  fixed URL
  Add reference to documentation in FormEvents phpdocs
  [YAML] Fix one-liners to work with multiple new lines
  Keep "pre" meaning for var_dump quick-and-dirty debug
  [Console][Table] Fix cell padding with multi-byte

Conflicts:
	src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget_attributes.html.php
	src/Symfony/Bundle/FrameworkBundle/composer.json
	src/Symfony/Component/Console/Helper/TableHelper.php
2015-02-11 08:12:14 +01:00
Fabien Potencier
24170a0eb7 renamed composer.phar to composer to be consistent with the Symfony docs 2015-02-08 08:41:14 +01:00
Fabien Potencier
b7c4104ea0 removed composer --dev option everywhere 2015-02-08 08:33:54 +01:00
Fabien Potencier
39a94beb5e Merge branch '2.6' into 2.7
* 2.6:
  [2.3] [HttpFoundation] [MimeTypeGuesser]
  Removed dead code and various cleaning
  Removed dead code and various cleaning
  [FrameworkBundle][xsd] added missing logging attribute.
  [Console] Make it clear that the second argument is not about command options.
  Added the '-' character for spaceless on tag start and end to be consistent for block, if, set and for nodes
  [Yaml] fixed parse shortcut Key after unindented collection.
  [Console] fixed #10531
  Make the container considered non-fresh if the environment parameters are changed
2015-01-25 05:39:35 +01:00
sarah khalil
150c80059c Removed dead code and various cleaning 2015-01-21 21:57:55 +01:00
Fabien Potencier
c1dc0e3667 Merge branch '2.6' into 2.7
* 2.6:
  fixed tests
  [EventDispatcher] Add missing checks to RegisterListenersPass
  Inline private 'is quoting required' methods in Escaper
  [Debug] fix loading order for legacy classes
  Add comment as requested
  Remove duplicate 'require'
  [Yaml] Improve YAML boolean escaping
2015-01-16 15:55:54 +01:00
Fabien Potencier
4e45617592 Merge branch '2.5' into 2.6
* 2.5:
  fixed tests
  [EventDispatcher] Add missing checks to RegisterListenersPass
  Inline private 'is quoting required' methods in Escaper
  [Debug] fix loading order for legacy classes
  Add comment as requested
  Remove duplicate 'require'
  [Yaml] Improve YAML boolean escaping

Conflicts:
	src/Symfony/Component/Yaml/Tests/InlineTest.php
2015-01-16 15:55:47 +01:00
Fabien Potencier
ed3019589c Merge branch '2.3' into 2.5
* 2.3:
  fixed tests
  [EventDispatcher] Add missing checks to RegisterListenersPass
  Inline private 'is quoting required' methods in Escaper
  [Debug] fix loading order for legacy classes
  Add comment as requested
  Remove duplicate 'require'
  [Yaml] Improve YAML boolean escaping

Conflicts:
	src/Symfony/Component/Debug/Exception/FatalErrorException.php
	src/Symfony/Component/HttpKernel/DependencyInjection/RegisterListenersPass.php
2015-01-16 15:51:58 +01:00
Nicolas Grekas
ee29381719 [Debug] fix loading order for legacy classes 2015-01-15 13:58:08 +01:00
Fabien Potencier
9b1895e0fa Merge branch '2.6' into 2.7
* 2.6:
  [FrameworkBundle] fix routing descriptor for options
  exit when Twig environment is not set
  [Routing] fix misleading test for condition
  [Debug] fix test
  [Debug] add missing conflict dep rules
  [TwigBundle] allowed SecurityBundle to use the latest versions of FrameworkBundle
  [HttpFoundation] Make use of isEmpty() method
  fix missing comma in YamlDumper
  [VarDumper] fix very special vars handling
  [Console] Helper\Table->addRow optimization
  [Console] Helper\Table->addRow optimization

Conflicts:
	src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_1.md
	src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_2.md
	src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_collection_1.md
2015-01-15 13:16:13 +01:00
Fabien Potencier
dc705a40a6 Merge branch '2.5' into 2.6
* 2.5:
  [Debug] add missing conflict dep rules
2015-01-13 11:55:35 +01:00
Fabien Potencier
5d7520c712 Merge branch '2.3' into 2.5
* 2.3:
  [Debug] add missing conflict dep rules
2015-01-13 11:55:30 +01:00
Nicolas Grekas
028a28b024 [Debug] add missing conflict dep rules 2015-01-13 10:04:07 +01:00
Fabien Potencier
e604b14862 removed code for PHP < 5.3.9 2015-01-09 14:24:18 +01:00
Fabien Potencier
9189ee1980 bumped min PHP version to 5.3.9 2015-01-09 07:51:41 +01:00
Fabien Potencier
e145cd06f8 minor #13060 [2.7] adds deprecation notices. (hhamon)
This PR was merged into the 2.7 branch.

Discussion
----------

[2.7] adds deprecation notices.

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | no
| BC breaks?    | no
| Deprecations? | yes
| Tests pass?   | yes
| Fixed tickets | #12608, #12672, #12675 #12684, #12686
| License       | MIT
| Doc PR        | ~

Commits
-------

f9fbb4f Fixes more deprecation notices as per @stof review.
fd47c07 Fixed some deprecations according to @stof feedbacks.
2a3e7d2 Normalizes deprecation notice messages.
738b9be [Validator] fixes UuidValidator deprecated class namespace.
e608ba6 [Form] adds more deprecation notices.
cd9617a [Validator] adds more deprecation notices.
a7f841e [Form] Adds a way to trigger deprecation notice on demand for VirtualFormAwareIterator class.
97efd2c Fixes more deprecation notices.
fd9c7bb Normalized @deprecated annotations.
39cfd47 Removed deprecation notices from test files.
2a9749d Fixes deprecation notices.
6f57b7b Reverted trigger_error() function calls on deprecated interfaces to prevent breaking third party projects implementing them.
86b9f6b Adds deprecation notices for structures to be removed in 3.0.
2015-01-05 21:51:33 +01:00
Nicolas Grekas
23e1d613b7 Merge branch '2.6' into 2.7
* 2.6:
  [2.6] fix deprecation silencing...
  [Form] fix Context\ExecutionContextInterface mock
  [Validator] marks TraversalStrategy::STOP_RECURSION constant internal as it has been introduced for the BC layer and will be removed in 3.0.
2015-01-05 19:25:37 +01:00
Hugo Hamon
2d4ca33b6d Fixed some deprecations according to @stof feedbacks. 2015-01-05 16:02:28 +01:00
Hugo Hamon
97856ba8bb Normalizes deprecation notice messages. 2015-01-05 16:02:28 +01:00
Hugo Hamon
ebc2a51176 Normalized @deprecated annotations. 2015-01-05 16:02:26 +01:00
Hugo Hamon
6b5a58f533 Adds deprecation notices for structures to be removed in 3.0. 2015-01-05 15:57:15 +01:00
Fabien Potencier
5e9b3f4a56 Merge branch '2.6' into 2.7
* 2.6:
  [2.6] cleanup deprecated uses
  [2.5] cleanup deprecated uses

Conflicts:
	src/Symfony/Component/Form/composer.json
	src/Symfony/Component/Security/Tests/Core/LegacySecurityContextInterfaceTest.php
2015-01-05 15:29:53 +01:00
Fabien Potencier
b29066e064 Merge branch '2.6' into 2.7
* 2.6:
  [Debug] fix test
  [Debug] split tests for deprecated interfaces
2015-01-04 19:09:45 +01:00
Nicolas Grekas
aa5794d256 Merge branch '2.6' into 2.7
* 2.6:
  fixed typo
  Fixed minor typo - override
  [Filesystem] enforce umask while testing
  [TwigBridge] moved fixtures into their own directory
  Use $this->iniSet() in tests
2015-01-03 23:52:01 +01:00
Nicolas Grekas
6e5c2b9e1f [2.3] Fix lowest deps 2015-01-03 19:20:28 +01:00
Nicolas Grekas
e18643bb9d Merge branch '2.6' into 2.7
* 2.6:
  [2.3] Remove useless tests skips
  [ClassLoader] removes deprecated classes from documentation.
  [ClassLoader] added missing deprecation notice.
  [HttpFoundation] Fix an issue caused by php's Bug #66606.
  [Yaml] Update README.md
  Don't add Accept-Range header on unsafe HTTP requests
  simplify hasScheme method
  adapted merge to 2.5
  adapted previous commit for 2.3
  [Security] Don't send remember cookie for sub request
  [Security] fixed wrong phpdoc
  [HttpKernel] Fix UriSigner::check when _hash is not at the end of the uri
  [2.3] Cleanup deprecations

Conflicts:
	src/Symfony/Bridge/Twig/composer.json
	src/Symfony/Bundle/FrameworkBundle/composer.json
	src/Symfony/Bundle/TwigBundle/composer.json
	src/Symfony/Component/ClassLoader/UniversalClassLoader.php
	src/Symfony/Component/Debug/composer.json
	src/Symfony/Component/Form/ButtonBuilder.php
	src/Symfony/Component/HttpKernel/Exception/FatalErrorException.php
	src/Symfony/Component/HttpKernel/Exception/FlattenException.php
	src/Symfony/Component/HttpKernel/composer.json
	src/Symfony/Component/Security/composer.json
	src/Symfony/Component/Validator/composer.json
2015-01-03 16:46:01 +01:00
Fabien Potencier
4b3b65f72c Merge branch '2.6' into 2.7
* 2.6:
  Use PHPUnit ini_set wrapper in tests
  [Process] Added a test skip check for Windows
  [Process] Removed unused variable assignment
  Fixes various phpdoc and coding standards.
  Fixes Issue #13184 - incremental output getters now return empty strings
  Updated copyright to 2015
  Updated copyright to 2015
  Updated copyright to 2015
  [VarDumper] increase debug.max_items to 2500
  [Debug] Update exception messages.
  use value of DIRECTORY_SEPARATOR to detect Windows
  force ExpressionLanguage version >= 2.6
  [Debug] fixes ClassNotFoundFatalErrorHandler to correctly handle class not found errors with Symfony ClassLoader component autoloaders.
  Clarify a comment.
  use PHP_WINDOWS_VERSION_BUILD to detect Windows
  Check if a field type_class is defined before using it.
  Currently if you want to use inline bootstrap form rendering, this is usually enough:

Conflicts:
	src/Symfony/Component/Debug/composer.json
2015-01-03 09:02:46 +01:00
Nicolas Grekas
4d52567ace [Debug] track and report deprecated classes and interfaces 2014-12-30 14:17:32 +01:00
Nicolas Grekas
52babf5396 [2.7] Allow 3.0 requirements 2014-12-27 12:44:51 +01:00
Fabien Potencier
daa33041ff Merge branch '2.6' into 2.7
* 2.6:
  [2.3] CS And DocBlock Fixes
  [2.3] CS Fixes
  [FrameworkBundle] Fixed Translation loader and update translation command.
  [Console] remove « use » statement for PHP built-in exception classes.
  [SecurityBundle] adds unit tests suite for SecurityDataCollector class.

Conflicts:
	src/Symfony/Bundle/SecurityBundle/DataCollector/SecurityDataCollector.php
2014-12-22 17:45:18 +01:00
Fabien Potencier
8ecd7655f2 Merge branch '2.6' into 2.7
* 2.6:
  [Security] Fixed tests
  [Debug] use ternary operator to simplify the getClassLoader() method in DebugClassLoader class.
2014-12-21 17:36:23 +01:00
Fabien Potencier
39f7b9d9e9 Merge branch '2.6' into 2.7
* 2.6: (23 commits)
  [Config] adds missing « use » statement for InvalidTypeException type hint in documentation.
  [Config] fixes broken unit test on ArrayNode class.
  fixed CS
  [Security] Delete old session on auth strategy migrate
  skip if param "translator.logging" doesn't exist.
  update required minimum TwigBridge version
  Very minor grammar fix in error message
  Added the function providers as container resources
  [Tests] Silenced all deprecations in tests for 2.3
  BinaryFileResponse - add missing newline
  fixed CS
  add a limit and a test to FlattenExceptionTest.
  [DebugBundle] enable the DumpDataCollectorPass
  [FrameworkBundle] Use debug namespace.
  [FrameworkBundle] update debug commands references
  skip compiler pass if interface doesn't exist
  Unify the way to provide expression functions for the DI container
  CS: There should be no empty lines following phpdocs
  fix link format handling with disabled templating
  [FrameworkBundle] fix cache:clear command
  ...

Conflicts:
	src/Symfony/Bridge/Doctrine/phpunit.xml.dist
	src/Symfony/Bridge/Monolog/phpunit.xml.dist
	src/Symfony/Bridge/Propel1/phpunit.xml.dist
	src/Symfony/Bridge/ProxyManager/phpunit.xml.dist
	src/Symfony/Bridge/Twig/phpunit.xml.dist
	src/Symfony/Bundle/FrameworkBundle/phpunit.xml.dist
	src/Symfony/Bundle/SecurityBundle/phpunit.xml.dist
	src/Symfony/Bundle/TwigBundle/phpunit.xml.dist
	src/Symfony/Bundle/WebProfilerBundle/phpunit.xml.dist
	src/Symfony/Component/BrowserKit/phpunit.xml.dist
	src/Symfony/Component/ClassLoader/phpunit.xml.dist
	src/Symfony/Component/Config/phpunit.xml.dist
	src/Symfony/Component/Console/phpunit.xml.dist
	src/Symfony/Component/CssSelector/phpunit.xml.dist
	src/Symfony/Component/Debug/phpunit.xml.dist
	src/Symfony/Component/DependencyInjection/phpunit.xml.dist
	src/Symfony/Component/DomCrawler/phpunit.xml.dist
	src/Symfony/Component/EventDispatcher/phpunit.xml.dist
	src/Symfony/Component/Filesystem/phpunit.xml.dist
	src/Symfony/Component/Finder/phpunit.xml.dist
	src/Symfony/Component/Form/phpunit.xml.dist
	src/Symfony/Component/HttpFoundation/phpunit.xml.dist
	src/Symfony/Component/HttpKernel/phpunit.xml.dist
	src/Symfony/Component/Intl/phpunit.xml.dist
	src/Symfony/Component/Locale/phpunit.xml.dist
	src/Symfony/Component/OptionsResolver/phpunit.xml.dist
	src/Symfony/Component/Process/phpunit.xml.dist
	src/Symfony/Component/PropertyAccess/phpunit.xml.dist
	src/Symfony/Component/Routing/phpunit.xml.dist
	src/Symfony/Component/Security/phpunit.xml.dist
	src/Symfony/Component/Serializer/phpunit.xml.dist
	src/Symfony/Component/Stopwatch/phpunit.xml.dist
	src/Symfony/Component/Templating/phpunit.xml.dist
	src/Symfony/Component/Translation/phpunit.xml.dist
	src/Symfony/Component/Validator/phpunit.xml.dist
	src/Symfony/Component/Yaml/phpunit.xml.dist
2014-12-20 17:07:09 +01:00
Nicolas Grekas
77d85b05dd Merge branch '2.6' into 2.7
* 2.6:
  [2.6] Test lowest versions of dependencies
  Test lowest versions of dependencies
  Fix placeholder date format
  Test components using their lowest possible deps
2014-12-16 21:28:45 +01:00
Nicolas Grekas
6ba896b035 Merge branch '2.6' into 2.7
* 2.6: (24 commits)
  [Form] fixed a maxlength overring on a guessing
  [Debug] Show only unique class candidates
  [SecurityBundle] Firewall providers building - code cleaning
  [Filesystem] symlink use RealPath instead LinkTarget
  [DependencyInjection] Remove duplicate  declaration in PhpDumper
  terminals are not interactive on Travis
  Revert "[DependencyInjection] backport perf optim"
  [WebProfiler] Tweaked ajax requests toolbar css reset
  [WebProfilerBundle] replaced pattern to path attribute in routes definitions.
  fix phpdoc's alignment
  Fix missing addExpressionLanguageProvider (used by service container to add expression providers)
  Fixed the AuthenticationProviderInterface alignment
  Fixed the proxy-manager version constraint
  Fix missing space in label_attr
  fix DumpDataCollectorTest after CS changes
  avoid risky tests
  Fixed typo in SecurityContext PHPDoc
  [FrameworkBundle][Template name] avoid  error message for the shortcut notation.
  [DependencyInjection] perf optim: call dirname() at most 5x
  [DependencyInjection] backport perf optim
  ...
2014-12-12 17:23:01 +01:00
Fabien Potencier
0de0b800f3 Merge branch '2.6' into 2.7
* 2.6: (25 commits)
  Added information when an error occured during validation of an answer of a question
  Adding note about known BC issues
  Adding note about the PdoSessionHandler BC break
  [Console] fixes some typos and phpdoc.
  fix phpdoc's alignment
  [2.6] CS Fixes And Removed An Unused Import
  Minor phpcs fixes
  [ClassLoader] Fix undefined index in ClassCollectionLoader
  CS fixes
  Revert "minor #12821 Remove deprecated class (MasterB)"
  [2.3] More cs fixes
  Removed unused imports
  CS fixes
  bumped Symfony version to 2.6.2
  updated VERSION for 2.6.1
  updated CHANGELOG for 2.6.1
  bumped Symfony version to 2.5.9
  updated VERSION for 2.5.8
  update CONTRIBUTORS for 2.5.8
  updated CHANGELOG for 2.5.8
  ...

Conflicts:
	src/Symfony/Component/HttpKernel/Kernel.php
2014-12-08 09:43:57 +01:00
Fabien Potencier
a56ff4422f Merge branch '2.6' into 2.7
* 2.6:
  Configure firewall's kernel exception listener with configured entry point or a default entry point
  PSR-2 fixes
  [DependencyInjection] make paths relative to __DIR__ in the generated container
  [FrameworkBundle][Router Cmd] use debug namespace.
  [FrameworkBundle] Update deprecated service call
  Removed a dev annotation from a version constraint
  Fixed the syntax of a composer.json file
  Fixed the symfony/config version constraint
  Tweaked the password-compat version constraint
  Docblock fixes
  [Filesystem] fix lock file permissions
  Remove dialog usage
  define constant only if it wasn't defined before
  Fix incorrect spanish translation
  Fixed typos
  Fixed a docblock
  bumped Symfony version to 2.6.1
  updated VERSION for 2.6.0
  updated CHANGELOG for 2.6.0
  removed unneeded check

Conflicts:
	src/Symfony/Component/HttpKernel/Kernel.php
2014-12-02 21:19:50 +01:00
Henry Snoek
4d01c33fd7 Fix tests after changes from #12598 2014-11-29 15:43:05 +01:00
Fabien Potencier
4d38ec5021 minor #12598 Improved error message (WouterJ)
This PR was merged into the 2.7 branch.

Discussion
----------

Improved error message

If no alternatives could be found, the error message is: "Attempted to call method "getContents" on class "SebastianBergmann\Diff\Diff"." This doesn't point out any error, as it doesn't tell you that the method does not exists. This PR tries to fix this.

Commits
-------

5076a77 Improved error message
2014-11-29 14:43:38 +01:00
David Fuhr
35d9057a4b Adjust error_reporting to allow deprecation messages for 3.0 2014-11-29 13:40:43 +01:00
Wouter J
7bc27bc03f Improved error message 2014-11-28 20:09:16 +01:00
Fabien Potencier
9cc21042eb Merge branch '2.6' into 2.7
* 2.6: (36 commits)
  [Debug] fix error message on double exception
  [Validator] make DateTime objects represented as strings in the violation message.
  [RFC] [DebugBundle] [HttpKernel] Avoid using container as dependency for DumpListener
  Upgrade information for the Translation component regarding the new LoggingTranslator class.
  [WebProfilerBundle] Remove usage of app.request in search bar template
  Fix initialized() with aliased services
  fix data type in docblock
  Rename Symfony2 to Symfony
  bumped Symfony version to 2.6.0
  updated VERSION for 2.6.0-BETA2
  updated CHANGELOG for 2.6.0-BETA2
  [Debug] fix ENT_SUBSTITUTE usage
  compare version using PHP_VERSION_ID
  backport #12489
  remove an unneeded check
  Remove block submit_widget
  reformat code as suggested by @fabpot
  Fix typo
  Make `\Request::get` more performant.
  properly set request attributes in controller test
  ...
2014-11-28 11:00:56 +01:00
Fabien Potencier
dacba8e89b Merge branch '2.6' into 2.7
* 2.6:
  Extract an AbstractEventDispatcherTest from EventDispatcherTest and also use it in ContainerAwareEventDispatcherTest
  [SecurityBundle] Authentication entry point is only registered with firewall exception listener, not with authentication listeners
  be smarter when guessing the document root
  Azerbaijani locale
  Fixed grammar error in docblock
  [HttpKernel] fix parse error in DumpDataCollector
  [TwigBundle/DebugBundle] move dump extension & cleanups
  Adjust upgrade file rendering
  [Bridge/Propel1] Changed deps to accepts all upcoming propel1 versions
  compare version using PHP_VERSION_ID
  [Form] Add doc for FormEvents
  *_timezone changes also affect the BirthdayType
  don't override internal PHP constants
  Drop support for model_timezone and view_timezone options in TimeType and DateType.
  [DomCrawler] Added support for link tags in the Link class
  [Session] Fix parameter names in WriteCheckSessionHandler
  Add consistency with request type checking
  [FrameworkBundle] Fix server run in case the router script does not exist
2014-11-20 14:24:30 +01:00
Fabien Potencier
3294ac5d66 updated version to 2.7 2014-11-10 19:00:54 +01:00
30 changed files with 993 additions and 356 deletions

View File

@@ -1,6 +1,14 @@
CHANGELOG
=========
2.7.0
-----
* added deprecations checking for parent interfaces/classes to DebugClassLoader
* added ZTS support to symfony_debug extension
* added symfony_debug_backtrace() to symfony_debug extension
to track the backtrace of fatal errors
2.6.0
-----

View File

@@ -30,20 +30,22 @@ class DebugClassLoader
private $isFinder;
private $wasFinder;
private static $caseCheck;
private static $deprecated = array();
private static $php7Reserved = array('int', 'float', 'bool', 'string', 'true', 'false', 'null');
/**
* Constructor.
*
* @param callable|object $classLoader
* @param callable|object $classLoader Passing an object is @deprecated since version 2.5 and support for it will be removed in 3.0
*
* @api
* @deprecated since 2.5, passing an object is deprecated and support for it will be removed in 3.0
*/
public function __construct($classLoader)
{
$this->wasFinder = is_object($classLoader) && method_exists($classLoader, 'findFile');
if ($this->wasFinder) {
@trigger_error('The '.__METHOD__.' method will no longer support receiving an object into its $classLoader argument in 3.0.', E_USER_DEPRECATED);
$this->classLoader = array($classLoader, 'loadClass');
$this->isFinder = true;
} else {
@@ -59,9 +61,7 @@ class DebugClassLoader
/**
* Gets the wrapped class loader.
*
* @return callable|object a class loader
*
* @deprecated since 2.5, returning an object is deprecated and support for it will be removed in 3.0
* @return callable|object A class loader. Since version 2.5, returning an object is @deprecated and support for it will be removed in 3.0
*/
public function getClassLoader()
{
@@ -69,7 +69,7 @@ class DebugClassLoader
}
/**
* Wraps all autoloaders
* Wraps all autoloaders.
*/
public static function enable()
{
@@ -117,16 +117,18 @@ class DebugClassLoader
}
/**
* Finds a file by class name
* Finds a file by class name.
*
* @param string $class A class name to resolve to file
*
* @return string|null
*
* @deprecated Deprecated since 2.5, to be removed in 3.0.
* @deprecated since version 2.5, to be removed in 3.0.
*/
public function findFile($class)
{
@trigger_error('The '.__METHOD__.' method is deprecated since version 2.5 and will be removed in 3.0.', E_USER_DEPRECATED);
if ($this->wasFinder) {
return $this->classLoader[0]->findFile($class);
}
@@ -175,6 +177,39 @@ class DebugClassLoader
if ($name !== $class && 0 === strcasecmp($name, $class)) {
throw new \RuntimeException(sprintf('Case mismatch between loaded and declared class names: %s vs %s', $class, $name));
}
if (in_array(strtolower($refl->getShortName()), self::$php7Reserved)) {
trigger_error(sprintf('%s uses a reserved class name (%s) that will break on PHP 7 and higher', $name, $refl->getShortName()), E_USER_DEPRECATED);
} elseif (preg_match('#\n \* @deprecated (.*?)\r?\n \*(?: @|/$)#s', $refl->getDocComment(), $notice)) {
self::$deprecated[$name] = preg_replace('#\s*\r?\n \* +#', ' ', $notice[1]);
} else {
if (2 > $len = 1 + (strpos($name, '\\', 1 + strpos($name, '\\')) ?: strpos($name, '_'))) {
$len = 0;
$ns = '';
} else {
switch ($ns = substr($name, 0, $len)) {
case 'Symfony\Bridge\\':
case 'Symfony\Bundle\\':
case 'Symfony\Component\\':
$ns = 'Symfony\\';
$len = strlen($ns);
break;
}
}
$parent = $refl->getParentClass();
if (!$parent || strncmp($ns, $parent->name, $len)) {
if ($parent && isset(self::$deprecated[$parent->name]) && strncmp($ns, $parent->name, $len)) {
@trigger_error(sprintf('The %s class extends %s that is deprecated %s', $name, $parent->name, self::$deprecated[$parent->name]), E_USER_DEPRECATED);
}
foreach ($refl->getInterfaceNames() as $interface) {
if (isset(self::$deprecated[$interface]) && strncmp($ns, $interface, $len) && !($parent && $parent->implementsInterface($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);
}
}
}
}
}
if ($file) {

View File

@@ -14,6 +14,7 @@ namespace Symfony\Component\Debug;
use Psr\Log\LogLevel;
use Psr\Log\LoggerInterface;
use Symfony\Component\Debug\Exception\ContextErrorException;
use Symfony\Component\Debug\Exception\FatalBaseException;
use Symfony\Component\Debug\Exception\FatalErrorException;
use Symfony\Component\Debug\Exception\OutOfMemoryException;
use Symfony\Component\Debug\FatalErrorHandler\UndefinedFunctionFatalErrorHandler;
@@ -46,7 +47,7 @@ use Symfony\Component\Debug\FatalErrorHandler\FatalErrorHandlerInterface;
class ErrorHandler
{
/**
* @deprecated since 2.6, to be removed in 3.0.
* @deprecated since version 2.6, to be removed in 3.0.
*/
const TYPE_DEPRECATION = -100;
@@ -71,19 +72,19 @@ class ErrorHandler
private $loggers = array(
E_DEPRECATED => array(null, LogLevel::INFO),
E_USER_DEPRECATED => array(null, LogLevel::INFO),
E_NOTICE => array(null, LogLevel::NOTICE),
E_USER_NOTICE => array(null, LogLevel::NOTICE),
E_STRICT => array(null, LogLevel::NOTICE),
E_NOTICE => array(null, LogLevel::WARNING),
E_USER_NOTICE => array(null, LogLevel::WARNING),
E_STRICT => array(null, LogLevel::WARNING),
E_WARNING => array(null, LogLevel::WARNING),
E_USER_WARNING => array(null, LogLevel::WARNING),
E_COMPILE_WARNING => array(null, LogLevel::WARNING),
E_CORE_WARNING => array(null, LogLevel::WARNING),
E_USER_ERROR => array(null, LogLevel::ERROR),
E_RECOVERABLE_ERROR => array(null, LogLevel::ERROR),
E_COMPILE_ERROR => array(null, LogLevel::EMERGENCY),
E_PARSE => array(null, LogLevel::EMERGENCY),
E_ERROR => array(null, LogLevel::EMERGENCY),
E_CORE_ERROR => array(null, LogLevel::EMERGENCY),
E_USER_ERROR => array(null, LogLevel::CRITICAL),
E_RECOVERABLE_ERROR => array(null, LogLevel::CRITICAL),
E_COMPILE_ERROR => array(null, LogLevel::CRITICAL),
E_PARSE => array(null, LogLevel::CRITICAL),
E_ERROR => array(null, LogLevel::CRITICAL),
E_CORE_ERROR => array(null, LogLevel::CRITICAL),
);
private $thrownErrors = 0x1FFF; // E_ALL - E_DEPRECATED - E_USER_DEPRECATED
@@ -101,16 +102,16 @@ class ErrorHandler
private static $stackedErrorLevels = array();
/**
* Same init value as thrownErrors
* Same init value as thrownErrors.
*
* @deprecated since 2.6, to be removed in 3.0.
* @deprecated since version 2.6, to be removed in 3.0.
*/
private $displayErrors = 0x1FFF;
/**
* Registers the error handler.
*
* @param self|null|int $handler The handler to register, or @deprecated (since 2.6, to be removed in 3.0) bit field of thrown levels
* @param self|null|int $handler The handler to register, or @deprecated (since version 2.6, to be removed in 3.0) bit field of thrown levels
* @param bool $replace Whether to replace or not any existing handler
*
* @return self The registered error handler
@@ -240,7 +241,7 @@ class ErrorHandler
}
/**
* Sets the error levels that are to be thrown.
* Sets the PHP error levels that throw an exception when a PHP error occurs.
*
* @param int $levels A bit field of E_* constants for thrown errors
* @param bool $replace Replace or amend the previous value
@@ -256,14 +257,14 @@ class ErrorHandler
}
$this->reRegister($prev | $this->loggedErrors);
// $this->displayErrors is @deprecated since 2.6
// $this->displayErrors is @deprecated since version 2.6
$this->displayErrors = $this->thrownErrors;
return $prev;
}
/**
* Sets the error levels that are logged or thrown with their local scope.
* Sets the PHP error levels for which local variables are preserved.
*
* @param int $levels A bit field of E_* constants for scoped errors
* @param bool $replace Replace or amend the previous value
@@ -282,7 +283,7 @@ class ErrorHandler
}
/**
* Sets the error levels that are logged with their stack trace.
* Sets the PHP error levels for which the stack trace is preserved.
*
* @param int $levels A bit field of E_* constants for traced errors
* @param bool $replace Replace or amend the previous value
@@ -356,69 +357,71 @@ class ErrorHandler
$throw = $this->thrownErrors & $type & $level;
$type &= $level | $this->screamedErrors;
if ($type && ($log || $throw)) {
if (PHP_VERSION_ID < 50400 && isset($context['GLOBALS']) && ($this->scopedErrors & $type)) {
$e = $context; // Whatever the signature of the method,
unset($e['GLOBALS'], $context); // $context is always a reference in 5.3
$context = $e;
}
if (!$type || (!$log && !$throw)) {
return $type && $log;
}
if ($throw) {
if (($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 {
$throw = new \ErrorException($this->levels[$type].': '.$message, 0, $type, $file, $line);
}
if (PHP_VERSION_ID < 50400 && isset($context['GLOBALS']) && ($this->scopedErrors & $type)) {
$e = $context; // Whatever the signature of the method,
unset($e['GLOBALS'], $context); // $context is always a reference in 5.3
$context = $e;
}
if (PHP_VERSION_ID <= 50407 && (PHP_VERSION_ID >= 50400 || PHP_VERSION_ID <= 50317)) {
// Exceptions thrown from error handlers are sometimes not caught by the exception
// handler and shutdown handlers are bypassed before 5.4.8/5.3.18.
// We temporarily re-enable display_errors to prevent any blank page related to this bug.
$throw->errorHandlerCanary = new ErrorHandlerCanary();
}
throw $throw;
}
// For duplicated errors, log the trace only once
$e = md5("{$type}/{$line}/{$file}\x00{$message}", true);
$trace = true;
if (!($this->tracedErrors & $type) || isset($this->loggedTraces[$e])) {
$trace = false;
if ($throw) {
if (($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 {
$this->loggedTraces[$e] = 1;
$throw = new \ErrorException($this->levels[$type].': '.$message, 0, $type, $file, $line);
}
$e = compact('type', 'file', 'line', 'level');
if (PHP_VERSION_ID <= 50407 && (PHP_VERSION_ID >= 50400 || PHP_VERSION_ID <= 50317)) {
// Exceptions thrown from error handlers are sometimes not caught by the exception
// handler and shutdown handlers are bypassed before 5.4.8/5.3.18.
// We temporarily re-enable display_errors to prevent any blank page related to this bug.
if ($type & $level) {
if ($this->scopedErrors & $type) {
$e['context'] = $context;
if ($trace) {
$e['stack'] = debug_backtrace(true); // Provide object
}
} elseif ($trace) {
$e['stack'] = debug_backtrace(PHP_VERSION_ID >= 50306 ? DEBUG_BACKTRACE_IGNORE_ARGS : false);
}
$throw->errorHandlerCanary = new ErrorHandlerCanary();
}
if ($this->isRecursive) {
$log = 0;
} elseif (self::$stackedErrorLevels) {
self::$stackedErrors[] = array($this->loggers[$type], $message, $e);
} else {
try {
$this->isRecursive = true;
$this->loggers[$type][0]->log($this->loggers[$type][1], $message, $e);
$this->isRecursive = false;
} catch (\Exception $e) {
$this->isRecursive = false;
throw $throw;
}
throw $e;
// For duplicated errors, log the trace only once
$e = md5("{$type}/{$line}/{$file}\x00{$message}", true);
$trace = true;
if (!($this->tracedErrors & $type) || isset($this->loggedTraces[$e])) {
$trace = false;
} else {
$this->loggedTraces[$e] = 1;
}
$e = compact('type', 'file', 'line', 'level');
if ($type & $level) {
if ($this->scopedErrors & $type) {
$e['scope_vars'] = $context;
if ($trace) {
$e['stack'] = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT);
}
} elseif ($trace) {
$e['stack'] = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
}
}
if ($this->isRecursive) {
$log = 0;
} elseif (self::$stackedErrorLevels) {
self::$stackedErrors[] = array($this->loggers[$type], $message, $e);
} else {
try {
$this->isRecursive = true;
$this->loggers[$type][0]->log(($type & $level) ? $this->loggers[$type][1] : LogLevel::DEBUG, $message, $e);
$this->isRecursive = false;
} catch (\Exception $e) {
$this->isRecursive = false;
throw $e;
}
}
@@ -428,23 +431,34 @@ class ErrorHandler
/**
* Handles an exception by logging then forwarding it to an other handler.
*
* @param \Exception $exception An exception to handle
* @param array $error An array as returned by error_get_last()
* @param \Exception|\BaseException $exception An exception to handle
* @param array $error An array as returned by error_get_last()
*
* @internal
*/
public function handleException(\Exception $exception, array $error = null)
public function handleException($exception, array $error = null)
{
$level = error_reporting();
if ($this->loggedErrors & E_ERROR & ($level | $this->screamedErrors)) {
if (!$exception instanceof \Exception) {
$exception = new FatalBaseException($exception);
}
$type = $exception instanceof FatalErrorException ? $exception->getSeverity() : E_ERROR;
if ($this->loggedErrors & $type) {
$e = array(
'type' => E_ERROR,
'type' => $type,
'file' => $exception->getFile(),
'line' => $exception->getLine(),
'level' => $level,
'level' => error_reporting(),
'stack' => $exception->getTrace(),
);
if ($exception instanceof FatalErrorException) {
if ($exception instanceof FatalBaseException) {
$error = array(
'type' => $type,
'message' => $message = $exception->getMessage(),
'file' => $e['file'],
'line' => $e['line'],
);
} elseif ($exception instanceof FatalErrorException) {
$message = 'Fatal '.$exception->getMessage();
} elseif ($exception instanceof \ErrorException) {
$message = 'Uncaught '.$exception->getMessage();
@@ -474,6 +488,9 @@ class ErrorHandler
} catch (\Exception $handlerException) {
$this->exceptionHandler = null;
$this->handleException($handlerException);
} catch (\BaseException $handlerException) {
$this->exceptionHandler = null;
$this->handleException($handlerException);
}
}
@@ -487,40 +504,44 @@ class ErrorHandler
public static function handleFatalError(array $error = null)
{
self::$reservedMemory = '';
$handler = set_error_handler('var_dump', 0);
$handler = is_array($handler) ? $handler[0] : null;
restore_error_handler();
if ($handler instanceof self) {
if (null === $error) {
$error = error_get_last();
}
try {
while (self::$stackedErrorLevels) {
static::unstackErrors();
}
} catch (\Exception $exception) {
// Handled below
}
if (!$handler instanceof self) {
return;
}
if ($error && ($error['type'] & (E_PARSE | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR))) {
// Let's not throw anymore but keep logging
$handler->throwAt(0, true);
if (null === $error) {
$error = error_get_last();
}
if (0 === strpos($error['message'], 'Allowed memory') || 0 === strpos($error['message'], 'Out of memory')) {
$exception = new OutOfMemoryException($handler->levels[$error['type']].': '.$error['message'], 0, $error['type'], $error['file'], $error['line'], 2, false);
} else {
$exception = new FatalErrorException($handler->levels[$error['type']].': '.$error['message'], 0, $error['type'], $error['file'], $error['line'], 2, true);
}
} elseif (!isset($exception)) {
return;
try {
while (self::$stackedErrorLevels) {
static::unstackErrors();
}
} catch (\Exception $exception) {
// Handled below
}
try {
$handler->handleException($exception, $error);
} catch (FatalErrorException $e) {
// Ignore this re-throw
if ($error && ($error['type'] & (E_PARSE | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR))) {
// Let's not throw anymore but keep logging
$handler->throwAt(0, true);
if (0 === strpos($error['message'], 'Allowed memory') || 0 === strpos($error['message'], 'Out of memory')) {
$exception = new OutOfMemoryException($handler->levels[$error['type']].': '.$error['message'], 0, $error['type'], $error['file'], $error['line'], 2, false);
} else {
$exception = new FatalErrorException($handler->levels[$error['type']].': '.$error['message'], 0, $error['type'], $error['file'], $error['line'], 2, true);
}
} elseif (!isset($exception)) {
return;
}
try {
$handler->handleException($exception, $error);
} catch (FatalErrorException $e) {
// Ignore this re-throw
}
}
@@ -541,7 +562,7 @@ class ErrorHandler
}
/**
* Unstacks stacked errors and forwards to the logger
* Unstacks stacked errors and forwards to the logger.
*/
public static function unstackErrors()
{
@@ -586,10 +607,12 @@ class ErrorHandler
*
* @param int|null $level The level (null to use the error_reporting() value and 0 to disable)
*
* @deprecated since 2.6, to be removed in 3.0. Use throwAt() instead.
* @deprecated since version 2.6, to be removed in 3.0. Use throwAt() instead.
*/
public function setLevel($level)
{
@trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the throwAt() method instead.', E_USER_DEPRECATED);
$level = null === $level ? error_reporting() : $level;
$this->throwAt($level, true);
}
@@ -599,10 +622,12 @@ class ErrorHandler
*
* @param int $displayErrors The display_errors flag value
*
* @deprecated since 2.6, to be removed in 3.0. Use throwAt() instead.
* @deprecated since version 2.6, to be removed in 3.0. Use throwAt() instead.
*/
public function setDisplayErrors($displayErrors)
{
@trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the throwAt() method instead.', E_USER_DEPRECATED);
if ($displayErrors) {
$this->throwAt($this->displayErrors, true);
} else {
@@ -618,10 +643,12 @@ class ErrorHandler
* @param LoggerInterface $logger A logger interface
* @param string $channel The channel associated with the logger (deprecation, emergency or scream)
*
* @deprecated since 2.6, to be removed in 3.0. Use setLoggers() or setDefaultLogger() instead.
* @deprecated since version 2.6, to be removed in 3.0. Use setLoggers() or setDefaultLogger() instead.
*/
public static function setLogger(LoggerInterface $logger, $channel = 'deprecation')
{
@trigger_error('The '.__METHOD__.' static method is deprecated since version 2.6 and will be removed in 3.0. Use the setLoggers() or setDefaultLogger() methods instead.', E_USER_DEPRECATED);
$handler = set_error_handler('var_dump', 0);
$handler = is_array($handler) ? $handler[0] : null;
restore_error_handler();
@@ -641,26 +668,30 @@ class ErrorHandler
}
/**
* @deprecated since 2.6, to be removed in 3.0. Use handleError() instead.
* @deprecated since version 2.6, to be removed in 3.0. Use handleError() instead.
*/
public function handle($level, $message, $file = 'unknown', $line = 0, $context = array())
{
$this->handleError(E_USER_DEPRECATED, 'The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the handleError() method instead.', __FILE__, __LINE__, array());
return $this->handleError($level, $message, $file, $line, (array) $context);
}
/**
* Handles PHP fatal errors.
*
* @deprecated since 2.6, to be removed in 3.0. Use handleFatalError() instead.
* @deprecated since version 2.6, to be removed in 3.0. Use handleFatalError() instead.
*/
public function handleFatal()
{
@trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the handleFatalError() method instead.', E_USER_DEPRECATED);
static::handleFatalError();
}
}
/**
* Private class used to work around https://bugs.php.net/54275
* Private class used to work around https://bugs.php.net/54275.
*
* @author Nicolas Grekas <p@tchwork.com>
*

View File

@@ -11,6 +11,8 @@
namespace Symfony\Component\Debug\Exception;
@trigger_error('The '.__NAMESPACE__.'\DummyException class is deprecated since version 2.5 and will be removed in 3.0.', E_USER_DEPRECATED);
/**
* @author Fabien Potencier <fabien@symfony.com>
*

View File

@@ -0,0 +1,44 @@
<?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\Exception;
/**
* Base Fatal Error Exception.
*
* @author Nicolas Grekas <p@tchwork.com>
*/
class FatalBaseException extends FatalErrorException
{
public function __construct(\BaseException $e)
{
if ($e instanceof \ParseException) {
$message = 'Parse error: '.$e->getMessage();
$severity = E_PARSE;
} elseif ($e instanceof \TypeException) {
$message = 'Type error: '.$e->getMessage();
$severity = E_RECOVERABLE_ERROR;
} else {
$message = 'Fatal error: '.$e->getMessage();
$severity = E_ERROR;
}
\ErrorException::__construct(
$message,
$e->getCode(),
$severity,
$e->getFile(),
$e->getLine()
);
$this->setTrace($e->getTrace());
}
}

View File

@@ -9,9 +9,7 @@
* file that was distributed with this source code.
*/
namespace Symfony\Component\Debug\Exception;
use Symfony\Component\HttpKernel\Exception\FatalErrorException as LegacyFatalErrorException;
namespace Symfony\Component\HttpKernel\Exception;
/**
* Fatal Error Exception.
@@ -19,21 +17,23 @@ use Symfony\Component\HttpKernel\Exception\FatalErrorException as LegacyFatalErr
* @author Fabien Potencier <fabien@symfony.com>
* @author Konstanton Myakshin <koc-dp@yandex.ru>
* @author Nicolas Grekas <p@tchwork.com>
*
* @deprecated Deprecated in 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
*/
class FatalErrorException extends LegacyFatalErrorException
class FatalErrorException extends \ErrorException
{
}
namespace Symfony\Component\HttpKernel\Exception;
namespace Symfony\Component\Debug\Exception;
use Symfony\Component\HttpKernel\Exception\FatalErrorException as LegacyFatalErrorException;
/**
* Fatal Error Exception.
*
* @author Konstanton Myakshin <koc-dp@yandex.ru>
*
* @deprecated Deprecated in 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
*/
class FatalErrorException extends \ErrorException
class FatalErrorException extends LegacyFatalErrorException
{
public function __construct($message, $code, $severity, $filename, $lineno, $traceOffset = null, $traceArgs = true)
{
@@ -69,6 +69,11 @@ class FatalErrorException extends \ErrorException
unset($frame);
$trace = array_reverse($trace);
} elseif (function_exists('symfony_debug_backtrace')) {
$trace = symfony_debug_backtrace();
if (0 < $traceOffset) {
array_splice($trace, 0, $traceOffset);
}
} else {
$trace = array();
}

View File

@@ -9,6 +9,46 @@
* file that was distributed with this source code.
*/
namespace Symfony\Component\HttpKernel\Exception;
use Symfony\Component\Debug\Exception\FlattenException as DebugFlattenException;
/**
* FlattenException wraps a PHP Exception to be able to serialize it.
*
* Basically, this class removes all objects from the trace.
*
* @author Fabien Potencier <fabien@symfony.com>
*
* @deprecated Deprecated in 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
*/
class FlattenException
{
private $handler;
public static function __callStatic($method, $args)
{
if (!method_exists('Symfony\Component\Debug\Exception\FlattenException', $method)) {
throw new \BadMethodCallException(sprintf('Call to undefined method %s::%s()', get_called_class(), $method));
}
return call_user_func_array(array('Symfony\Component\Debug\Exception\FlattenException', $method), $args);
}
public function __call($method, $args)
{
if (!isset($this->handler)) {
$this->handler = new DebugFlattenException();
}
if (!method_exists($this->handler, $method)) {
throw new \BadMethodCallException(sprintf('Call to undefined method %s::%s()', get_class($this), $method));
}
return call_user_func_array(array($this->handler, $method), $args);
}
}
namespace Symfony\Component\Debug\Exception;
use Symfony\Component\HttpKernel\Exception\FlattenException as LegacyFlattenException;
@@ -250,35 +290,3 @@ class FlattenException extends LegacyFlattenException
return $array['__PHP_Incomplete_Class_Name'];
}
}
namespace Symfony\Component\HttpKernel\Exception;
use Symfony\Component\Debug\Exception\FlattenException as DebugFlattenException;
/**
* FlattenException wraps a PHP Exception to be able to serialize it.
*
* Basically, this class removes all objects from the trace.
*
* @author Fabien Potencier <fabien@symfony.com>
*
* @deprecated Deprecated in 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
*/
class FlattenException
{
private $handler;
public static function __callStatic($method, $args)
{
return forward_static_call_array(array('Symfony\Component\Debug\Exception\FlattenException', $method), $args);
}
public function __call($method, $args)
{
if (!isset($this->handler)) {
$this->handler = new DebugFlattenException();
}
return call_user_func_array(array($this->handler, $method), $args);
}
}

View File

@@ -30,27 +30,37 @@ use Symfony\Component\Debug\Exception\OutOfMemoryException;
class ExceptionHandler
{
private $debug;
private $charset;
private $handler;
private $caughtBuffer;
private $caughtLength;
private $fileLinkFormat;
public function __construct($debug = true, $fileLinkFormat = null)
public function __construct($debug = true, $charset = null, $fileLinkFormat = null)
{
if (false !== strpos($charset, '%') xor false === strpos($fileLinkFormat, '%')) {
// Swap $charset and $fileLinkFormat for BC reasons
$pivot = $fileLinkFormat;
$fileLinkFormat = $charset;
$charset = $pivot;
}
$this->debug = $debug;
$this->charset = $charset ?: ini_get('default_charset') ?: 'UTF-8';
$this->fileLinkFormat = $fileLinkFormat ?: ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format');
}
/**
* Registers the exception handler.
*
* @param bool $debug
* @param bool $debug Enable/disable debug mode, where the stack trace is displayed
* @param string|null $charset The charset used by exception messages
* @param string|null $fileLinkFormat The IDE link template
*
* @return ExceptionHandler The registered exception handler
*/
public static function register($debug = true, $fileLinkFormat = null)
public static function register($debug = true, $charset = null, $fileLinkFormat = null)
{
$handler = new static($debug, $fileLinkFormat = null);
$handler = new static($debug, $charset, $fileLinkFormat);
$prev = set_exception_handler(array($handler, 'handle'));
if (is_array($prev) && $prev[0] instanceof ErrorHandler) {
@@ -177,6 +187,7 @@ class ExceptionHandler
foreach ($exception->getHeaders() as $name => $value) {
header($name.': '.$value, false);
}
header('Content-Type: text/html; charset='.$this->charset);
}
echo $this->decorate($this->getContent($exception), $this->getStylesheet($exception));
@@ -195,7 +206,7 @@ class ExceptionHandler
$exception = FlattenException::create($exception);
}
return new Response($this->decorate($this->getContent($exception), $this->getStylesheet($exception)), $exception->getStatusCode(), $exception->getHeaders());
return Response::create($this->decorate($this->getContent($exception), $this->getStylesheet($exception)), $exception->getStatusCode(), $exception->getHeaders())->setCharset($this->charset);
}
/**
@@ -223,7 +234,7 @@ class ExceptionHandler
foreach ($exception->toArray() as $position => $e) {
$ind = $count - $position + 1;
$class = $this->formatClass($e['class']);
$message = nl2br(self::utf8Htmlize($e['message']));
$message = nl2br($this->escapeHtml($e['message']));
$content .= sprintf(<<<EOF
<h2 class="block_exception clear_fix">
<span class="exception_counter">%d/%d</span>
@@ -251,7 +262,7 @@ EOF
} catch (\Exception $e) {
// something nasty happened and we cannot throw an exception anymore
if ($this->debug) {
$title = sprintf('Exception thrown when handling an exception (%s: %s)', get_class($e), $e->getMessage());
$title = sprintf('Exception thrown when handling an exception (%s: %s)', get_class($e), $this->escapeHtml($e->getMessage()));
} else {
$title = 'Whoops, looks like something went wrong.';
}
@@ -337,7 +348,7 @@ EOF;
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta charset="{$this->charset}" />
<meta name="robots" content="noindex,nofollow" />
<style>
/* Copyright (c) 2010, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.com/yui/license.html */
@@ -360,16 +371,16 @@ EOF;
{
$parts = explode('\\', $class);
return sprintf("<abbr title=\"%s\">%s</abbr>", $class, array_pop($parts));
return sprintf('<abbr title="%s">%s</abbr>', $class, array_pop($parts));
}
private function formatPath($path, $line)
{
$path = self::utf8Htmlize($path);
$path = $this->escapeHtml($path);
$file = preg_match('#[^/\\\\]*$#', $path, $file) ? $file[0] : $path;
if ($linkFormat = $this->fileLinkFormat) {
$link = str_replace(array('%f', '%l'), array($path, $line), $linkFormat);
$link = strtr($this->escapeHtml($linkFormat), array('%f' => $path, '%l' => (int) $line));
return sprintf(' in <a href="%s" title="Go to source">%s line %d</a>', $link, $file, $line);
}
@@ -389,11 +400,11 @@ EOF;
$result = array();
foreach ($args as $key => $item) {
if ('object' === $item[0]) {
$formattedValue = sprintf("<em>object</em>(%s)", $this->formatClass($item[1]));
$formattedValue = sprintf('<em>object</em>(%s)', $this->formatClass($item[1]));
} elseif ('array' === $item[0]) {
$formattedValue = sprintf("<em>array</em>(%s)", is_array($item[1]) ? $this->formatArgs($item[1]) : $item[1]);
$formattedValue = sprintf('<em>array</em>(%s)', is_array($item[1]) ? $this->formatArgs($item[1]) : $item[1]);
} elseif ('string' === $item[0]) {
$formattedValue = sprintf("'%s'", self::utf8Htmlize($item[1]));
$formattedValue = sprintf("'%s'", $this->escapeHtml($item[1]));
} elseif ('null' === $item[0]) {
$formattedValue = '<em>null</em>';
} elseif ('boolean' === $item[0]) {
@@ -401,7 +412,7 @@ EOF;
} elseif ('resource' === $item[0]) {
$formattedValue = '<em>resource</em>';
} else {
$formattedValue = str_replace("\n", '', var_export(self::utf8Htmlize((string) $item[1]), true));
$formattedValue = str_replace("\n", '', var_export($this->escapeHtml((string) $item[1]), true));
}
$result[] = is_int($key) ? $formattedValue : sprintf("'%s' => %s", $key, $formattedValue);
@@ -411,24 +422,25 @@ EOF;
}
/**
* Returns an UTF-8 and HTML encoded string
* Returns an UTF-8 and HTML encoded string.
*
* @deprecated since version 2.7, to be removed in 3.0.
*/
protected static function utf8Htmlize($str)
{
if (!preg_match('//u', $str) && function_exists('iconv')) {
set_error_handler('var_dump', 0);
$charset = ini_get('default_charset');
if ('UTF-8' === $charset || $str !== @iconv($charset, $charset, $str)) {
$charset = 'CP1252';
}
restore_error_handler();
$str = iconv($charset, 'UTF-8', $str);
}
@trigger_error('The '.__METHOD__.' method is deprecated since version 2.7 and will be removed in 3.0.', E_USER_DEPRECATED);
return htmlspecialchars($str, ENT_QUOTES | (PHP_VERSION_ID >= 50400 ? ENT_SUBSTITUTE : 0), 'UTF-8');
}
/**
* HTML-encodes a string.
*/
private function escapeHtml($str)
{
return htmlspecialchars($str, ENT_QUOTES | (PHP_VERSION_ID >= 50400 ? ENT_SUBSTITUTE : 0), $this->charset);
}
/**
* @internal
*/

View File

@@ -77,7 +77,7 @@ class ClassNotFoundFatalErrorHandler implements FatalErrorHandlerInterface
/**
* Tries to guess the full namespace for a given class name.
*
* By default, it looks for PSR-0 classes registered via a Symfony or a Composer
* By default, it looks for PSR-0 and PSR-4 classes registered via a Symfony or a Composer
* autoloader (that should cover all common cases).
*
* @param string $class A class name (without its namespace)
@@ -101,7 +101,7 @@ class ClassNotFoundFatalErrorHandler implements FatalErrorHandlerInterface
if ($function[0] instanceof DebugClassLoader) {
$function = $function[0]->getClassLoader();
// Since 2.5, returning an object from DebugClassLoader::getClassLoader() is @deprecated
// @deprecated since version 2.5. Returning an object from DebugClassLoader::getClassLoader() is deprecated.
if (is_object($function)) {
$function = array($function);
}
@@ -118,6 +118,13 @@ class ClassNotFoundFatalErrorHandler implements FatalErrorHandlerInterface
}
}
}
if ($function[0] instanceof ComposerClassLoader) {
foreach ($function[0]->getPrefixesPsr4() as $prefix => $paths) {
foreach ($paths as $path) {
$classes = array_merge($classes, $this->findClassInPath($path, $class, $prefix));
}
}
}
}
return array_unique($classes);
@@ -132,13 +139,13 @@ class ClassNotFoundFatalErrorHandler implements FatalErrorHandlerInterface
*/
private function findClassInPath($path, $class, $prefix)
{
if (!$path = realpath($path)) {
if (!$path = realpath($path.'/'.strtr($prefix, '\\_', '//')) ?: realpath($path.'/'.dirname(strtr($prefix, '\\_', '//'))) ?: realpath($path)) {
return array();
}
$classes = array();
$filename = $class.'.php';
foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
if ($filename == $file->getFileName() && $class = $this->convertFileToClass($path, $file->getPathName(), $prefix)) {
$classes[] = $class;
}
@@ -160,13 +167,21 @@ class ClassNotFoundFatalErrorHandler implements FatalErrorHandlerInterface
// namespaced class
$namespacedClass = str_replace(array($path.DIRECTORY_SEPARATOR, '.php', '/'), array('', '', '\\'), $file),
// namespaced class (with target dir)
$namespacedClassTargetDir = $prefix.str_replace(array($path.DIRECTORY_SEPARATOR, '.php', '/'), array('', '', '\\'), $file),
$prefix.$namespacedClass,
// namespaced class (with target dir and separator)
$prefix.'\\'.$namespacedClass,
// PEAR class
str_replace('\\', '_', $namespacedClass),
// PEAR class (with target dir)
str_replace('\\', '_', $namespacedClassTargetDir),
str_replace('\\', '_', $prefix.$namespacedClass),
// PEAR class (with target dir and separator)
str_replace('\\', '_', $prefix.'\\'.$namespacedClass),
);
if ($prefix) {
$candidates = array_filter($candidates, function ($candidate) use ($prefix) {return 0 === strpos($candidate, $prefix);});
}
// We cannot use the autoloader here as most of them use require; but if the class
// is not found, the new autoloader call will require the file again leading to a
// "cannot redeclare class" error.

View File

@@ -34,7 +34,7 @@ class UndefinedMethodFatalErrorHandler implements FatalErrorHandlerInterface
$className = $matches[1];
$methodName = $matches[2];
$message = sprintf('Attempted to call method "%s" on class "%s".', $methodName, $className);
$message = sprintf('Attempted to call an undefined method named "%s" of class "%s".', $methodName, $className);
$candidates = array();
foreach (get_class_methods($className) as $definedMethodName) {

View File

@@ -39,5 +39,5 @@ Resources
You can run the unit tests with the following command:
$ cd path/to/Symfony/Component/Debug/
$ composer.phar install --dev
$ composer install
$ phpunit

133
Resources/ext/README.md Normal file
View File

@@ -0,0 +1,133 @@
Symfony Debug Extension
=======================
This extension publishes several functions to help building powerful debugging tools.
symfony_zval_info()
-------------------
- exposes zval_hash/refcounts, allowing e.g. efficient exploration of arbitrary structures in PHP,
- does work with references, preventing memory copying.
Its behavior is about the same as:
```php
<?php
function symfony_zval_info($key, $array, $options = 0)
{
// $options is currently not used, but could be in future version.
if (!array_key_exists($key, $array)) {
return null;
}
$info = array(
'type' => gettype($array[$key]),
'zval_hash' => /* hashed memory address of $array[$key] */,
'zval_refcount' => /* internal zval refcount of $array[$key] */,
'zval_isref' => /* is_ref status of $array[$key] */,
);
switch ($info['type']) {
case 'object':
$info += array(
'object_class' => get_class($array[$key]),
'object_refcount' => /* internal object refcount of $array[$key] */,
'object_hash' => spl_object_hash($array[$key]),
'object_handle' => /* internal object handle $array[$key] */,
);
break;
case 'resource':
$info += array(
'resource_handle' => (int) $array[$key],
'resource_type' => get_resource_type($array[$key]),
'resource_refcount' => /* internal resource refcount of $array[$key] */,
);
break;
case 'array':
$info += array(
'array_count' => count($array[$key]),
);
break;
case 'string':
$info += array(
'strlen' => strlen($array[$key]),
);
break;
}
return $info;
}
```
symfony_debug_backtrace()
-------------------------
This function works like debug_backtrace(), except that it can fetch the full backtrace in case of fatal errors:
```php
function foo() { fatal(); }
function bar() { foo(); }
function sd() { var_dump(symfony_debug_backtrace()); }
register_shutdown_function('sd');
bar();
/* Will output
Fatal error: Call to undefined function fatal() in foo.php on line 42
array(3) {
[0]=>
array(2) {
["function"]=>
string(2) "sd"
["args"]=>
array(0) {
}
}
[1]=>
array(4) {
["file"]=>
string(7) "foo.php"
["line"]=>
int(1)
["function"]=>
string(3) "foo"
["args"]=>
array(0) {
}
}
[2]=>
array(4) {
["file"]=>
string(102) "foo.php"
["line"]=>
int(2)
["function"]=>
string(3) "bar"
["args"]=>
array(0) {
}
}
}
*/
```
Usage
-----
The extension is compatible with ZTS mode, and should be supported by PHP5.3, 5.4, 5.5 and 5.6.
To enable the extension from source, run:
```
phpize
./configure
make
sudo make install
```

View File

@@ -1,72 +0,0 @@
Symfony Debug Extension
=======================
This extension adds a ``symfony_zval_info($key, $array, $options = 0)`` function that:
- exposes zval_hash/refcounts, allowing e.g. efficient exploration of arbitrary structures in PHP,
- does work with references, preventing memory copying.
Its behavior is about the same as:
.. code-block:: php
<?php
function symfony_zval_info($key, $array, $options = 0)
{
// $options is currently not used, but could be in future version.
if (!array_key_exists($key, $array)) {
return null;
}
$info = array(
'type' => gettype($array[$key]),
'zval_hash' => /* hashed memory address of $array[$key] */,
'zval_refcount' => /* internal zval refcount of $array[$key] */,
'zval_isref' => /* is_ref status of $array[$key] */,
);
switch ($info['type']) {
case 'object':
$info += array(
'object_class' => get_class($array[$key]),
'object_refcount' => /* internal object refcount of $array[$key] */,
'object_hash' => spl_object_hash($array[$key]),
'object_handle' => /* internal object handle $array[$key] */,
);
break;
case 'resource':
$info += array(
'resource_handle' => (int) $array[$key],
'resource_type' => get_resource_type($array[$key]),
'resource_refcount' => /* internal resource refcount of $array[$key] */,
);
break;
case 'array':
$info += array(
'array_count' => count($array[$key]),
);
break;
case 'string':
$info += array(
'strlen' => strlen($array[$key]),
);
break;
}
return $info;
}
To enable the extension from source, run:
.. code-block:: sh
phpize
./configure
make
sudo make install

View File

@@ -13,7 +13,7 @@
extern zend_module_entry symfony_debug_module_entry;
#define phpext_symfony_debug_ptr &symfony_debug_module_entry
#define PHP_SYMFONY_DEBUG_VERSION "1.0"
#define PHP_SYMFONY_DEBUG_VERSION "2.7"
#ifdef PHP_WIN32
# define PHP_SYMFONY_DEBUG_API __declspec(dllexport)
@@ -29,6 +29,8 @@ extern zend_module_entry symfony_debug_module_entry;
ZEND_BEGIN_MODULE_GLOBALS(symfony_debug)
intptr_t req_rand_init;
void (*old_error_cb)(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args);
zval *debug_bt;
ZEND_END_MODULE_GLOBALS(symfony_debug)
PHP_MINIT_FUNCTION(symfony_debug);
@@ -40,11 +42,14 @@ PHP_GINIT_FUNCTION(symfony_debug);
PHP_GSHUTDOWN_FUNCTION(symfony_debug);
PHP_FUNCTION(symfony_zval_info);
PHP_FUNCTION(symfony_debug_backtrace);
static char *_symfony_debug_memory_address_hash(void *);
static char *_symfony_debug_memory_address_hash(void * TSRMLS_DC);
static const char *_symfony_debug_zval_type(zval *);
static const char* _symfony_debug_get_resource_type(long);
static int _symfony_debug_get_resource_refcount(long);
static const char* _symfony_debug_get_resource_type(long TSRMLS_DC);
static int _symfony_debug_get_resource_refcount(long TSRMLS_DC);
void symfony_debug_error_cb(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args);
#ifdef ZTS
#define SYMFONY_DEBUG_G(v) TSRMG(symfony_debug_globals_id, zend_symfony_debug_globals *, v)

View File

@@ -12,6 +12,9 @@
#endif
#include "php.h"
#ifdef ZTS
#include "TSRM.h"
#endif
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_symfony_debug.h"
@@ -19,6 +22,13 @@
#include "ext/standard/php_lcg.h"
#include "ext/spl/php_spl.h"
#include "Zend/zend_gc.h"
#include "Zend/zend_builtin_functions.h"
#include "Zend/zend_extensions.h" /* for ZEND_EXTENSION_API_NO */
#include "ext/standard/php_array.h"
#include "Zend/zend_interfaces.h"
#include "SAPI.h"
#define IS_PHP_53 ZEND_EXTENSION_API_NO == 220090626
ZEND_DECLARE_MODULE_GLOBALS(symfony_debug)
@@ -30,9 +40,28 @@ ZEND_END_ARG_INFO()
const zend_function_entry symfony_debug_functions[] = {
PHP_FE(symfony_zval_info, symfony_zval_arginfo)
PHP_FE(symfony_debug_backtrace, NULL)
PHP_FE_END
};
PHP_FUNCTION(symfony_debug_backtrace)
{
if (zend_parse_parameters_none() == FAILURE) {
return;
}
#if IS_PHP_53
zend_fetch_debug_backtrace(return_value, 1, 0 TSRMLS_CC);
#else
zend_fetch_debug_backtrace(return_value, 1, 0, 0 TSRMLS_CC);
#endif
if (!SYMFONY_DEBUG_G(debug_bt)) {
return;
}
php_array_merge(Z_ARRVAL_P(return_value), Z_ARRVAL_P(SYMFONY_DEBUG_G(debug_bt)), 0 TSRMLS_CC);
}
PHP_FUNCTION(symfony_zval_info)
{
zval *key = NULL, *arg = NULL;
@@ -40,7 +69,7 @@ PHP_FUNCTION(symfony_zval_info)
HashTable *array = NULL;
long options = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "zh|l", &key, &array, &options) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zh|l", &key, &array, &options) == FAILURE) {
return;
}
@@ -62,13 +91,14 @@ PHP_FUNCTION(symfony_zval_info)
array_init(return_value);
add_assoc_string(return_value, "type", (char *)_symfony_debug_zval_type(arg), 1);
add_assoc_stringl(return_value, "zval_hash", _symfony_debug_memory_address_hash((void *)arg), 16, 1);
add_assoc_stringl(return_value, "zval_hash", _symfony_debug_memory_address_hash((void *)arg TSRMLS_CC), 16, 0);
add_assoc_long(return_value, "zval_refcount", Z_REFCOUNT_P(arg));
add_assoc_bool(return_value, "zval_isref", (zend_bool)Z_ISREF_P(arg));
if (Z_TYPE_P(arg) == IS_OBJECT) {
static char hash[33] = {0};
php_spl_object_hash(arg, (char *)hash);
char hash[33] = {0};
php_spl_object_hash(arg, (char *)hash TSRMLS_CC);
add_assoc_stringl(return_value, "object_class", (char *)Z_OBJCE_P(arg)->name, Z_OBJCE_P(arg)->name_length, 1);
add_assoc_long(return_value, "object_refcount", EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(arg)].bucket.obj.refcount);
add_assoc_string(return_value, "object_hash", hash, 1);
@@ -77,17 +107,41 @@ PHP_FUNCTION(symfony_zval_info)
add_assoc_long(return_value, "array_count", zend_hash_num_elements(Z_ARRVAL_P(arg)));
} else if(Z_TYPE_P(arg) == IS_RESOURCE) {
add_assoc_long(return_value, "resource_handle", Z_LVAL_P(arg));
add_assoc_string(return_value, "resource_type", (char *)_symfony_debug_get_resource_type(Z_LVAL_P(arg)), 1);
add_assoc_long(return_value, "resource_refcount", _symfony_debug_get_resource_refcount(Z_LVAL_P(arg)));
add_assoc_string(return_value, "resource_type", (char *)_symfony_debug_get_resource_type(Z_LVAL_P(arg) TSRMLS_CC), 1);
add_assoc_long(return_value, "resource_refcount", _symfony_debug_get_resource_refcount(Z_LVAL_P(arg) TSRMLS_CC));
} else if (Z_TYPE_P(arg) == IS_STRING) {
add_assoc_long(return_value, "strlen", Z_STRLEN_P(arg));
}
}
static const char* _symfony_debug_get_resource_type(long rsid)
void symfony_debug_error_cb(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args)
{
TSRMLS_FETCH();
zval *retval;
switch (type) {
case E_ERROR:
case E_PARSE:
case E_CORE_ERROR:
case E_CORE_WARNING:
case E_COMPILE_ERROR:
case E_COMPILE_WARNING:
ALLOC_INIT_ZVAL(retval);
#if IS_PHP_53
zend_fetch_debug_backtrace(retval, 1, 0 TSRMLS_CC);
#else
zend_fetch_debug_backtrace(retval, 1, 0, 0 TSRMLS_CC);
#endif
SYMFONY_DEBUG_G(debug_bt) = retval;
}
SYMFONY_DEBUG_G(old_error_cb)(type, error_filename, error_lineno, format, args);
}
static const char* _symfony_debug_get_resource_type(long rsid TSRMLS_DC)
{
const char *res_type;
res_type = zend_rsrc_list_get_rsrc_type(rsid);
res_type = zend_rsrc_list_get_rsrc_type(rsid TSRMLS_CC);
if (!res_type) {
return "Unknown";
@@ -96,7 +150,7 @@ static const char* _symfony_debug_get_resource_type(long rsid)
return res_type;
}
static int _symfony_debug_get_resource_refcount(long rsid)
static int _symfony_debug_get_resource_refcount(long rsid TSRMLS_DC)
{
zend_rsrc_list_entry *le;
@@ -107,21 +161,21 @@ static int _symfony_debug_get_resource_refcount(long rsid)
return 0;
}
static char *_symfony_debug_memory_address_hash(void *address)
static char *_symfony_debug_memory_address_hash(void *address TSRMLS_DC)
{
static char result[17] = {0};
char *result = NULL;
intptr_t address_rand;
if (!SYMFONY_DEBUG_G(req_rand_init)) {
if (!BG(mt_rand_is_seeded)) {
php_mt_srand(GENERATE_SEED() TSRMLS_CC);
}
SYMFONY_DEBUG_G(req_rand_init) = (intptr_t)php_mt_rand();
SYMFONY_DEBUG_G(req_rand_init) = (intptr_t)php_mt_rand(TSRMLS_C);
}
address_rand = (intptr_t)address ^ SYMFONY_DEBUG_G(req_rand_init);
snprintf(result, 17, "%016zx", address_rand);
spprintf(&result, 17, "%016zx", address_rand);
return result;
}
@@ -187,7 +241,7 @@ ZEND_GET_MODULE(symfony_debug)
PHP_GINIT_FUNCTION(symfony_debug)
{
symfony_debug_globals->req_rand_init = 0;
memset(symfony_debug_globals, 0 , sizeof(*symfony_debug_globals));
}
PHP_GSHUTDOWN_FUNCTION(symfony_debug)
@@ -197,11 +251,16 @@ PHP_GSHUTDOWN_FUNCTION(symfony_debug)
PHP_MINIT_FUNCTION(symfony_debug)
{
SYMFONY_DEBUG_G(old_error_cb) = zend_error_cb;
zend_error_cb = symfony_debug_error_cb;
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(symfony_debug)
{
zend_error_cb = SYMFONY_DEBUG_G(old_error_cb);
return SUCCESS;
}

View File

@@ -3,7 +3,7 @@ Test symfony_zval_info API
--SKIPIF--
<?php if (!extension_loaded("symfony_debug")) print "skip"; ?>
--FILE--
<?php
<?php
$int = 42;
$float = 42.42;
@@ -88,7 +88,7 @@ array(8) {
["object_hash"]=>
string(32) "%s"
["object_handle"]=>
int(1)
int(%d)
}
array(5) {
["type"]=>
@@ -112,7 +112,7 @@ array(7) {
["zval_isref"]=>
bool(false)
["resource_handle"]=>
int(4)
int(%d)
["resource_type"]=>
string(6) "stream"
["resource_refcount"]=>

View File

@@ -0,0 +1,64 @@
--TEST--
Test symfony_debug_backtrace in case of fatal error
--SKIPIF--
<?php if (!extension_loaded("symfony_debug")) print "skip"; ?>
--FILE--
<?php
function bar()
{
foo();
}
function foo()
{
notexist();
}
function bt()
{
print_r(symfony_debug_backtrace());
}
register_shutdown_function('bt');
bar();
?>
--EXPECTF--
Fatal error: Call to undefined function notexist() in %s on line %d
Array
(
[0] => Array
(
[function] => bt
[args] => Array
(
)
)
[1] => Array
(
[file] => %s
[line] => %d
[function] => foo
[args] => Array
(
)
)
[2] => Array
(
[file] => %s
[line] => %d
[function] => bar
[args] => Array
(
)
)
)

View File

@@ -0,0 +1,47 @@
--TEST--
Test symfony_debug_backtrace in case of non fatal error
--SKIPIF--
<?php if (!extension_loaded("symfony_debug")) print "skip"; ?>
--FILE--
<?php
function bar()
{
bt();
}
function bt()
{
print_r(symfony_debug_backtrace());
}
bar();
?>
--EXPECTF--
Array
(
[0] => Array
(
[file] => %s
[line] => %d
[function] => bt
[args] => Array
(
)
)
[1] => Array
(
[file] => %s
[line] => %d
[function] => bar
[args] => Array
(
)
)
)

View File

@@ -0,0 +1,85 @@
--TEST--
Test ErrorHandler in case of fatal error
--SKIPIF--
<?php if (!extension_loaded("symfony_debug")) print "skip"; ?>
--FILE--
<?php
namespace Psr\Log;
class LogLevel
{
const EMERGENCY = 'emergency';
const ALERT = 'alert';
const CRITICAL = 'critical';
const ERROR = 'error';
const WARNING = 'warning';
const NOTICE = 'notice';
const INFO = 'info';
const DEBUG = 'debug';
}
namespace Symfony\Component\Debug;
$dir = __DIR__.'/../../../';
require $dir.'ErrorHandler.php';
require $dir.'Exception/FatalErrorException.php';
require $dir.'Exception/UndefinedFunctionException.php';
require $dir.'FatalErrorHandler/FatalErrorHandlerInterface.php';
require $dir.'FatalErrorHandler/ClassNotFoundFatalErrorHandler.php';
require $dir.'FatalErrorHandler/UndefinedFunctionFatalErrorHandler.php';
require $dir.'FatalErrorHandler/UndefinedMethodFatalErrorHandler.php';
function bar()
{
foo();
}
function foo()
{
notexist();
}
$handler = ErrorHandler::register();
$handler->setExceptionHandler('print_r');
if (function_exists('xdebug_disable')) {
xdebug_disable();
}
bar();
?>
--EXPECTF--
Fatal error: Call to undefined function Symfony\Component\Debug\notexist() in %s on line %d
Symfony\Component\Debug\Exception\UndefinedFunctionException Object
(
[message:protected] => Attempted to call function "notexist" from namespace "Symfony\Component\Debug".
[string:Exception:private] =>
[code:protected] => 0
[file:protected] => -
[line:protected] => %d
[trace:Exception:private] => Array
(
[0] => Array
(
%A [function] => Symfony\Component\Debug\foo
%A [args] => Array
(
)
)
[1] => Array
(
%A [function] => Symfony\Component\Debug\bar
%A [args] => Array
(
)
)
%A
)
[previous:Exception:private] =>
[severity:protected] => 1
)

View File

@@ -61,6 +61,10 @@ class DebugClassLoaderTest extends \PHPUnit_Framework_TestCase
public function testUnsilencing()
{
if (PHP_VERSION_ID >= 70000) {
$this->markTestSkipped('PHP7 throws exceptions, unsilencing is not required anymore.');
}
ob_start();
$this->iniSet('log_errors', 0);
@@ -100,9 +104,14 @@ class DebugClassLoaderTest extends \PHPUnit_Framework_TestCase
// if an exception is thrown, the test passed
restore_error_handler();
restore_exception_handler();
$this->assertEquals(E_STRICT, $exception->getSeverity());
$this->assertStringStartsWith(__FILE__, $exception->getFile());
$this->assertRegexp('/^Runtime Notice: Declaration/', $exception->getMessage());
if (PHP_VERSION_ID < 70000) {
$this->assertRegexp('/^Runtime Notice: Declaration/', $exception->getMessage());
$this->assertEquals(E_STRICT, $exception->getSeverity());
} else {
$this->assertRegexp('/^Warning: Declaration/', $exception->getMessage());
$this->assertEquals(E_WARNING, $exception->getSeverity());
}
} catch (\Exception $exception) {
restore_error_handler();
restore_exception_handler();
@@ -153,6 +162,87 @@ class DebugClassLoaderTest extends \PHPUnit_Framework_TestCase
{
$this->assertTrue(class_exists(__NAMESPACE__.'\Fixtures\ClassAlias', true));
}
/**
* @dataProvider provideDeprecatedSuper
*/
public function testDeprecatedSuper($class, $super, $type)
{
set_error_handler('var_dump', 0);
$e = error_reporting(0);
trigger_error('', E_USER_DEPRECATED);
class_exists('Test\\'.__NAMESPACE__.'\\'.$class, true);
error_reporting($e);
restore_error_handler();
$lastError = error_get_last();
unset($lastError['file'], $lastError['line']);
$xError = array(
'type' => E_USER_DEPRECATED,
'message' => 'The Test\Symfony\Component\Debug\Tests\\'.$class.' class '.$type.' Symfony\Component\Debug\Tests\Fixtures\\'.$super.' that is deprecated but this is a test deprecation notice.',
);
$this->assertSame($xError, $lastError);
}
public function provideDeprecatedSuper()
{
return array(
array('DeprecatedInterfaceClass', 'DeprecatedInterface', 'implements'),
array('DeprecatedParentClass', 'DeprecatedClass', 'extends'),
);
}
public function testDeprecatedSuperInSameNamespace()
{
set_error_handler('var_dump', 0);
$e = error_reporting(0);
trigger_error('', E_USER_NOTICE);
class_exists('Symfony\Bridge\Debug\Tests\Fixtures\ExtendsDeprecatedParent', 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 testReservedForPhp7()
{
if (PHP_VERSION_ID >= 70000) {
$this->markTestSkipped('PHP7 already prevents using reserved names.');
}
set_error_handler('var_dump', 0);
$e = error_reporting(0);
trigger_error('', E_USER_NOTICE);
class_exists('Test\\'.__NAMESPACE__.'\\Float', true);
error_reporting($e);
restore_error_handler();
$lastError = error_get_last();
unset($lastError['file'], $lastError['line']);
$xError = array(
'type' => E_USER_DEPRECATED,
'message' => 'Test\Symfony\Component\Debug\Tests\Float uses a reserved class name (Float) that will break on PHP 7 and higher',
);
$this->assertSame($xError, $lastError);
}
}
class ClassLoader
@@ -182,6 +272,16 @@ class ClassLoader
return __DIR__.'/Fixtures/reallyNotPsr0.php';
} elseif (__NAMESPACE__.'\Fixtures\NotPSR0bis' === $class) {
return __DIR__.'/Fixtures/notPsr0Bis.php';
} elseif (__NAMESPACE__.'\Fixtures\DeprecatedInterface' === $class) {
return __DIR__.'/Fixtures/DeprecatedInterface.php';
} elseif ('Symfony\Bridge\Debug\Tests\Fixtures\ExtendsDeprecatedParent' === $class) {
eval('namespace Symfony\Bridge\Debug\Tests\Fixtures; class ExtendsDeprecatedParent extends \\'.__NAMESPACE__.'\Fixtures\DeprecatedClass {}');
} elseif ('Test\\'.__NAMESPACE__.'\DeprecatedParentClass' === $class) {
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__.'\Float' === $class) {
eval('namespace Test\\'.__NAMESPACE__.'; class Float {}');
}
}
}

View File

@@ -141,19 +141,19 @@ class ErrorHandlerTest extends \PHPUnit_Framework_TestCase
$loggers = array(
E_DEPRECATED => array(null, LogLevel::INFO),
E_USER_DEPRECATED => array(null, LogLevel::INFO),
E_NOTICE => array($logger, LogLevel::NOTICE),
E_NOTICE => array($logger, LogLevel::WARNING),
E_USER_NOTICE => array($logger, LogLevel::CRITICAL),
E_STRICT => array(null, LogLevel::NOTICE),
E_STRICT => array(null, LogLevel::WARNING),
E_WARNING => array(null, LogLevel::WARNING),
E_USER_WARNING => array(null, LogLevel::WARNING),
E_COMPILE_WARNING => array(null, LogLevel::WARNING),
E_CORE_WARNING => array(null, LogLevel::WARNING),
E_USER_ERROR => array(null, LogLevel::ERROR),
E_RECOVERABLE_ERROR => array(null, LogLevel::ERROR),
E_COMPILE_ERROR => array(null, LogLevel::EMERGENCY),
E_PARSE => array(null, LogLevel::EMERGENCY),
E_ERROR => array(null, LogLevel::EMERGENCY),
E_CORE_ERROR => array(null, LogLevel::EMERGENCY),
E_USER_ERROR => array(null, LogLevel::CRITICAL),
E_RECOVERABLE_ERROR => array(null, LogLevel::CRITICAL),
E_COMPILE_ERROR => array(null, LogLevel::CRITICAL),
E_PARSE => array(null, LogLevel::CRITICAL),
E_ERROR => array(null, LogLevel::CRITICAL),
E_CORE_ERROR => array(null, LogLevel::CRITICAL),
);
$this->assertSame($loggers, $handler->setLoggers(array()));
@@ -336,7 +336,7 @@ class ErrorHandlerTest extends \PHPUnit_Framework_TestCase
$logArgCheck = function ($level, $message, $context) use ($that) {
$that->assertEquals('Fatal Parse Error: foo', $message);
$that->assertArrayHasKey('type', $context);
$that->assertEquals($context['type'], E_ERROR);
$that->assertEquals($context['type'], E_PARSE);
};
$logger
@@ -345,7 +345,7 @@ class ErrorHandlerTest extends \PHPUnit_Framework_TestCase
->will($this->returnCallback($logArgCheck))
;
$handler->setDefaultLogger($logger, E_ERROR);
$handler->setDefaultLogger($logger, E_PARSE);
$handler->handleFatalError($error);
@@ -359,6 +359,9 @@ class ErrorHandlerTest extends \PHPUnit_Framework_TestCase
}
}
/**
* @group legacy
*/
public function testLegacyInterface()
{
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
@@ -386,7 +389,7 @@ class ErrorHandlerTest extends \PHPUnit_Framework_TestCase
;
$handler = ErrorHandler::register(E_NOTICE);
$handler->setLogger($logger, 'scream');
@$handler->setLogger($logger, 'scream');
unset($undefVar);
@$undefVar++;

View File

@@ -189,9 +189,9 @@ class FlattenExceptionTest extends \PHPUnit_Framework_TestCase
public function testTooBigArray()
{
$a = array();
for ($i = 0; $i < 20; $i++) {
for ($j = 0; $j < 50; $j++) {
for ($k = 0; $k < 10; $k++) {
for ($i = 0; $i < 20; ++$i) {
for ($j = 0; $j < 50; ++$j) {
for ($k = 0; $k < 10; ++$k) {
$a[$i][$j][$k] = 'value';
}
}

View File

@@ -15,18 +15,52 @@ use Symfony\Component\ClassLoader\ClassLoader as SymfonyClassLoader;
use Symfony\Component\ClassLoader\UniversalClassLoader as SymfonyUniversalClassLoader;
use Symfony\Component\Debug\Exception\FatalErrorException;
use Symfony\Component\Debug\FatalErrorHandler\ClassNotFoundFatalErrorHandler;
use Symfony\Component\Debug\DebugClassLoader;
use Composer\Autoload\ClassLoader as ComposerClassLoader;
class ClassNotFoundFatalErrorHandlerTest extends \PHPUnit_Framework_TestCase
{
public static function setUpBeforeClass()
{
foreach (spl_autoload_functions() as $function) {
if (!is_array($function)) {
continue;
}
// get class loaders wrapped by DebugClassLoader
if ($function[0] instanceof DebugClassLoader) {
$function = $function[0]->getClassLoader();
}
if ($function[0] instanceof ComposerClassLoader) {
$function[0]->add('Symfony_Component_Debug_Tests_Fixtures', dirname(dirname(dirname(dirname(dirname(__DIR__))))));
break;
}
}
}
/**
* @dataProvider provideClassNotFoundData
*/
public function testHandleClassNotFound($error, $translatedMessage)
public function testHandleClassNotFound($error, $translatedMessage, $autoloader = null)
{
if ($autoloader) {
// Unregister all autoloaders to ensure the custom provided
// autoloader is the only one to be used during the test run.
$autoloaders = spl_autoload_functions();
array_map('spl_autoload_unregister', $autoloaders);
spl_autoload_register($autoloader);
}
$handler = new ClassNotFoundFatalErrorHandler();
$exception = $handler->handleError($error, new FatalErrorException('', 0, $error['type'], $error['file'], $error['line']));
if ($autoloader) {
spl_autoload_unregister($autoloader);
array_map('spl_autoload_register', $autoloaders);
}
$this->assertInstanceof('Symfony\Component\Debug\Exception\ClassNotFoundException', $exception);
$this->assertSame($translatedMessage, $exception->getMessage());
$this->assertSame($error['type'], $exception->getSeverity());
@@ -35,34 +69,37 @@ class ClassNotFoundFatalErrorHandlerTest extends \PHPUnit_Framework_TestCase
}
/**
* @dataProvider provideLegacyClassNotFoundData
* @group legacy
*/
public function testLegacyHandleClassNotFound($error, $translatedMessage, $autoloader)
public function testLegacyHandleClassNotFound()
{
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
// Unregister all autoloaders to ensure the custom provided
// autoloader is the only one to be used during the test run.
$autoloaders = spl_autoload_functions();
array_map('spl_autoload_unregister', $autoloaders);
spl_autoload_register($autoloader);
$prefixes = array('Symfony\Component\Debug\Exception\\' => realpath(__DIR__.'/../../Exception'));
$symfonyUniversalClassLoader = new SymfonyUniversalClassLoader();
$symfonyUniversalClassLoader->registerPrefixes($prefixes);
$handler = new ClassNotFoundFatalErrorHandler();
$exception = $handler->handleError($error, new FatalErrorException('', 0, $error['type'], $error['file'], $error['line']));
spl_autoload_unregister($autoloader);
array_map('spl_autoload_register', $autoloaders);
$this->assertInstanceof('Symfony\Component\Debug\Exception\ClassNotFoundException', $exception);
$this->assertSame($translatedMessage, $exception->getMessage());
$this->assertSame($error['type'], $exception->getSeverity());
$this->assertSame($error['file'], $exception->getFile());
$this->assertSame($error['line'], $exception->getLine());
$this->testHandleClassNotFound(
array(
'type' => 1,
'line' => 12,
'file' => 'foo.php',
'message' => 'Class \'Foo\\Bar\\UndefinedFunctionException\' not found',
),
"Attempted to load class \"UndefinedFunctionException\" from namespace \"Foo\Bar\".\nDid you forget a \"use\" statement for \"Symfony\Component\Debug\Exception\UndefinedFunctionException\"?",
array($symfonyUniversalClassLoader, 'loadClass')
);
}
public function provideClassNotFoundData()
{
$prefixes = array('Symfony\Component\Debug\Exception\\' => realpath(__DIR__.'/../../Exception'));
$symfonyAutoloader = new SymfonyClassLoader();
$symfonyAutoloader->addPrefixes($prefixes);
$debugClassLoader = new DebugClassLoader(array($symfonyAutoloader, 'loadClass'));
return array(
array(
array(
@@ -109,20 +146,6 @@ class ClassNotFoundFatalErrorHandlerTest extends \PHPUnit_Framework_TestCase
),
"Attempted to load class \"UndefinedFunctionException\" from namespace \"Foo\Bar\".\nDid you forget a \"use\" statement for \"Symfony\Component\Debug\Exception\UndefinedFunctionException\"?",
),
);
}
public function provideLegacyClassNotFoundData()
{
$prefixes = array('Symfony\Component\Debug\Exception\\' => realpath(__DIR__.'/../../Exception'));
$symfonyAutoloader = new SymfonyClassLoader();
$symfonyAutoloader->addPrefixes($prefixes);
$symfonyUniversalClassLoader = new SymfonyUniversalClassLoader();
$symfonyUniversalClassLoader->registerPrefixes($prefixes);
return array(
array(
array(
'type' => 1,
@@ -141,7 +164,7 @@ class ClassNotFoundFatalErrorHandlerTest extends \PHPUnit_Framework_TestCase
'message' => 'Class \'Foo\\Bar\\UndefinedFunctionException\' not found',
),
"Attempted to load class \"UndefinedFunctionException\" from namespace \"Foo\Bar\".\nDid you forget a \"use\" statement for \"Symfony\Component\Debug\Exception\UndefinedFunctionException\"?",
array($symfonyUniversalClassLoader, 'loadClass'),
array($debugClassLoader, 'loadClass'),
),
array(
array(
@@ -158,11 +181,11 @@ class ClassNotFoundFatalErrorHandlerTest extends \PHPUnit_Framework_TestCase
public function testCannotRedeclareClass()
{
if (!file_exists(__DIR__.'/../FIXTURES/REQUIREDTWICE.PHP')) {
if (!file_exists(__DIR__.'/../FIXTURES2/REQUIREDTWICE.PHP')) {
$this->markTestSkipped('Can only be run on case insensitive filesystems');
}
require_once __DIR__.'/../FIXTURES/REQUIREDTWICE.PHP';
require_once __DIR__.'/../FIXTURES2/REQUIREDTWICE.PHP';
$error = array(
'type' => 1,

View File

@@ -41,7 +41,7 @@ class UndefinedMethodFatalErrorHandlerTest extends \PHPUnit_Framework_TestCase
'file' => 'foo.php',
'message' => 'Call to undefined method SplObjectStorage::what()',
),
'Attempted to call method "what" on class "SplObjectStorage".',
'Attempted to call an undefined method named "what" of class "SplObjectStorage".',
),
array(
array(
@@ -50,7 +50,7 @@ class UndefinedMethodFatalErrorHandlerTest extends \PHPUnit_Framework_TestCase
'file' => 'foo.php',
'message' => 'Call to undefined method SplObjectStorage::walid()',
),
"Attempted to call method \"walid\" on class \"SplObjectStorage\".\nDid you mean to call \"valid\"?",
"Attempted to call an undefined method named \"walid\" of class \"SplObjectStorage\".\nDid you mean to call \"valid\"?",
),
array(
array(
@@ -59,7 +59,7 @@ class UndefinedMethodFatalErrorHandlerTest extends \PHPUnit_Framework_TestCase
'file' => 'foo.php',
'message' => 'Call to undefined method SplObjectStorage::offsetFet()',
),
"Attempted to call method \"offsetFet\" on class \"SplObjectStorage\".\nDid you mean to call e.g. \"offsetGet\", \"offsetSet\" or \"offsetUnset\"?",
"Attempted to call an undefined method named \"offsetFet\" of class \"SplObjectStorage\".\nDid you mean to call e.g. \"offsetGet\", \"offsetSet\" or \"offsetUnset\"?",
),
);
}

View File

@@ -0,0 +1,12 @@
<?php
namespace Symfony\Component\Debug\Tests\Fixtures;
/**
* @deprecated but this is a test
* deprecation notice.
* @foobar
*/
class DeprecatedClass
{
}

View File

@@ -0,0 +1,12 @@
<?php
namespace Symfony\Component\Debug\Tests\Fixtures;
/**
* @deprecated but this is a test
* deprecation notice.
* @foobar
*/
interface DeprecatedInterface
{
}

View File

@@ -1,7 +0,0 @@
<?php
namespace Symfony\Component\Debug\Tests\Fixtures;
class RequiredTwice
{
}

View File

@@ -0,0 +1,7 @@
<?php
namespace Symfony\Component\Debug\Tests\Fixtures2;
class RequiredTwice
{
}

View File

@@ -3,7 +3,7 @@
"type": "library",
"description": "Symfony Debug Component",
"keywords": [],
"homepage": "http://symfony.com",
"homepage": "https://symfony.com",
"license": "MIT",
"authors": [
{
@@ -12,14 +12,18 @@
},
{
"name": "Symfony Community",
"homepage": "http://symfony.com/contributors"
"homepage": "https://symfony.com/contributors"
}
],
"require": {
"php": ">=5.3.3",
"php": ">=5.3.9",
"psr/log": "~1.0"
},
"conflict": {
"symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
},
"require-dev": {
"symfony/phpunit-bridge": "~2.7",
"symfony/class-loader": "~2.2",
"symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2",
"symfony/http-foundation": "~2.1"
@@ -29,13 +33,12 @@
"symfony/http-kernel": ""
},
"autoload": {
"psr-0": { "Symfony\\Component\\Debug\\": "" }
"psr-4": { "Symfony\\Component\\Debug\\": "" }
},
"target-dir": "Symfony/Component/Debug",
"minimum-stability": "dev",
"extra": {
"branch-alias": {
"dev-master": "2.6-dev"
"dev-master": "2.7-dev"
}
}
}

View File

@@ -7,13 +7,16 @@
bootstrap="vendor/autoload.php"
>
<php>
<!-- Silence E_USER_DEPRECATED (-16385 == -1 & ~E_USER_DEPRECATED) -->
<ini name="error_reporting" value="-16385"/>
<ini name="error_reporting" value="-1" />
</php>
<testsuites>
<testsuite name="Symfony Debug Component Test Suite">
<directory>./Tests/</directory>
</testsuite>
<testsuite name="Symfony Debug Extension Test Suite">
<directory suffix=".phpt">./Resources/ext/tests/</directory>
</testsuite>
</testsuites>
<filter>