Commit 903d772e authored by Fabien Potencier's avatar Fabien Potencier

Merge branch '1.3'

* 1.3:
  updated changelog
  allowed Twig 2.0
  allowed Symfony 3.0
  simplifed composer.json
  fixed some Form deprecations
  removed deprecated method call in the exception handler
  fixed test that did not restore the error handler properly
  added symfony/phpunit to catch deprecation notices
  Verify that the spool is enabled and an actual spool before flushing it
  [Docs] Add some links in the services chapter
parents 1a86c37a 721d8de4
...@@ -8,9 +8,11 @@ cache: ...@@ -8,9 +8,11 @@ cache:
before_script: before_script:
# symfony/* # symfony/*
- sh -c "if [ '$SYMFONY_DEPS_VERSION' = '2.8' ]; then sed -i 's/~2.6/2.8.*@dev/g' composer.json; composer update --dev --prefer-source; fi" - sh -c "if [ '$TWIG_VERSION' != '2.0' ]; then sed -i 's/~1.8|~2.0/~1.8/g' composer.json; composer update; fi"
- sh -c "if [ '$SYMFONY_DEPS_VERSION' = '2.7' ]; then sed -i 's/~2.6/2.7.*@dev/g' composer.json; composer update --dev --prefer-source; fi" - sh -c "if [ '$SYMFONY_DEPS_VERSION' = '3.0' ]; then sed -i 's/~2\.7|3\.0\.\*/3.0.*@dev/g' composer.json; composer update; fi"
- composer install --dev --prefer-source - sh -c "if [ '$SYMFONY_DEPS_VERSION' = '2.8' ]; then sed -i 's/~2\.7|3\.0\.\*/2.8.*@dev/g' composer.json; composer update; fi"
- sh -c "if [ '$SYMFONY_DEPS_VERSION' = '' ]; then sed -i 's/~2\.7|3\.0\.\*/2.7.*@dev/g' composer.json; composer update; fi"
- composer install
script: phpunit script: phpunit
...@@ -18,8 +20,10 @@ matrix: ...@@ -18,8 +20,10 @@ matrix:
include: include:
- php: 5.5 - php: 5.5
- php: 5.6 - php: 5.6
env: SYMFONY_DEPS_VERSION=2.7 env: TWIG_VERSION=2.0
- php: 5.6 - php: 5.6
env: SYMFONY_DEPS_VERSION=2.8 env: SYMFONY_DEPS_VERSION=2.8
- php: 5.6
env: SYMFONY_DEPS_VERSION=3
- php: 7.0 - php: 7.0
- php: hhvm - php: hhvm
{ {
"minimum-stability": "dev",
"name": "silex/silex", "name": "silex/silex",
"description": "The PHP micro-framework based on the Symfony Components", "description": "The PHP micro-framework based on the Symfony Components",
"keywords": ["microframework"], "keywords": ["microframework"],
...@@ -18,41 +17,35 @@ ...@@ -18,41 +17,35 @@
"require": { "require": {
"php": ">=5.5.9", "php": ">=5.5.9",
"pimple/pimple": "~3.0", "pimple/pimple": "~3.0",
"symfony/event-dispatcher": "~2.7", "symfony/event-dispatcher": "~2.7|3.0.*",
"symfony/http-foundation": "~2.7", "symfony/http-foundation": "~2.7|3.0.*",
"symfony/http-kernel": "~2.7", "symfony/http-kernel": "~2.7|3.0.*",
"symfony/routing": "~2.7" "symfony/routing": "~2.7|3.0.*"
}, },
"require-dev": { "require-dev": {
"symfony/asset": "~2.7", "symfony/asset": "~2.7|3.0.*",
"symfony/security": "~2.7", "symfony/security": "~2.7|3.0.*",
"symfony/config": "~2.7", "symfony/config": "~2.7|3.0.*",
"symfony/locale": "~2.7", "symfony/locale": "~2.7|3.0.*",
"symfony/form": "~2.7", "symfony/form": "~2.7|3.0.*",
"symfony/browser-kit": "~2.7", "symfony/browser-kit": "~2.7|3.0.*",
"symfony/css-selector": "~2.7", "symfony/css-selector": "~2.7|3.0.*",
"symfony/debug": "~2.7", "symfony/debug": "~2.7|3.0.*",
"symfony/dom-crawler": "~2.7", "symfony/dom-crawler": "~2.7|3.0.*",
"symfony/finder": "~2.7", "symfony/finder": "~2.7|3.0.*",
"symfony/monolog-bridge": "~2.7", "symfony/monolog-bridge": "~2.7|3.0.*",
"symfony/doctrine-bridge": "~2.7", "symfony/doctrine-bridge": "~2.7|3.0.*",
"symfony/options-resolver": "~2.7", "symfony/options-resolver": "~2.7|3.0.*",
"symfony/process": "~2.7", "symfony/process": "~2.7|3.0.*",
"symfony/serializer": "~2.7", "symfony/serializer": "~2.7|3.0.*",
"symfony/translation": "~2.7", "symfony/translation": "~2.7|3.0.*",
"symfony/twig-bridge": "~2.7", "symfony/twig-bridge": "~2.7|3.0.*",
"symfony/validator": "~2.7", "symfony/validator": "~2.7|3.0.*",
"symfony/var-dumper": "~2.7", "symfony/var-dumper": "~2.7|3.0.*",
"twig/twig": ">=1.8.0,<2.0-dev", "twig/twig": "~1.8|~2.0",
"doctrine/dbal": "~2.2", "doctrine/dbal": "~2.2",
"swiftmailer/swiftmailer": "5.*", "swiftmailer/swiftmailer": "~5",
"monolog/monolog": "~1.4,>=1.4.1" "monolog/monolog": "^1.4.1"
},
"suggest": {
"symfony/browser-kit": "~2.7",
"symfony/css-selector": "~2.7",
"symfony/dom-crawler": "~2.7",
"symfony/form": "~2.7"
}, },
"replace": { "replace": {
"silex/api": "self.version", "silex/api": "self.version",
...@@ -68,5 +61,6 @@ ...@@ -68,5 +61,6 @@
"branch-alias": { "branch-alias": {
"dev-master": "2.0.x-dev" "dev-master": "2.0.x-dev"
} }
} },
"minimum-stability": "dev"
} }
...@@ -27,7 +27,10 @@ Changelog ...@@ -27,7 +27,10 @@ Changelog
1.3.3 (2015-XX-XX) 1.3.3 (2015-XX-XX)
------------------ ------------------
* n/a * added support for Symfony 3.0 and Twig 2.0
* fixed some Form deprecations
* removed deprecated method call in the exception handler
* fixed Swiftmailer spool flushing when spool is not enabled
1.3.2 (2015-08-24) 1.3.2 (2015-08-24)
------------------ ------------------
......
...@@ -192,7 +192,7 @@ Silex defines a range of services. ...@@ -192,7 +192,7 @@ Silex defines a range of services.
route parameters. route parameters.
* **controllers**: The ``Silex\ControllerCollection`` that is used internally. * **controllers**: The ``Silex\ControllerCollection`` that is used internally.
Check the *Internals* chapter for more information. Check the :doc:`Internals chapter <internals>` for more information.
* **dispatcher**: The `EventDispatcher * **dispatcher**: The `EventDispatcher
<http://api.symfony.com/master/Symfony/Component/EventDispatcher/EventDispatcher.html>`_ <http://api.symfony.com/master/Symfony/Component/EventDispatcher/EventDispatcher.html>`_
...@@ -210,16 +210,16 @@ Silex defines a range of services. ...@@ -210,16 +210,16 @@ Silex defines a range of services.
Request as input and returns a Response as output. Request as input and returns a Response as output.
* **request_context**: The request context is a simplified representation of * **request_context**: The request context is a simplified representation of
the request that is used by the Router and the UrlGenerator. the request that is used by the Router and the :doc:`UrlGenerator </providers/url_generator.rst>`.
* **exception_handler**: The Exception handler is the default handler that is * **exception_handler**: The Exception handler is the default handler that is
used when you don't register one via the ``error()`` method or if your used when you don't register one via the ``error()`` method or if your
handler does not return a Response. Disable it with handler does not return a Response. Disable it with
``unset($app['exception_handler'])``. ``unset($app['exception_handler'])``.
* **logger**: A ``Psr\Log\LoggerInterface`` instance. By default, logging is * **logger**: A `LoggerInterface <https://github.com/php-fig/log/blob/master/Psr/Log/LoggerInterface.php>`_ instance. By default, logging is
disabled as the value is set to ``null``. To enable logging you can either use disabled as the value is set to ``null``. To enable logging you can either use
the ``MonologServiceProvider`` or define your own ``logger`` service that the :doc:`MonologServiceProvider <providers/monolog>` or define your own ``logger`` service that
conforms to the PSR logger interface. conforms to the PSR logger interface.
Core traits Core traits
......
...@@ -29,7 +29,7 @@ trait FormTrait ...@@ -29,7 +29,7 @@ trait FormTrait
* *
* @return FormBuilder * @return FormBuilder
*/ */
public function form($data = null, array $options = array(), $type = 'form') public function form($data = null, array $options = array(), $type = 'Symfony\Component\Form\Extension\Core\Type\FormType')
{ {
return $this['form.factory']->createBuilder($type, $data, $options); return $this['form.factory']->createBuilder($type, $data, $options);
} }
......
...@@ -12,7 +12,9 @@ ...@@ -12,7 +12,9 @@
namespace Silex; namespace Silex;
use Symfony\Component\Debug\ExceptionHandler as DebugExceptionHandler; use Symfony\Component\Debug\ExceptionHandler as DebugExceptionHandler;
use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\KernelEvents;
...@@ -34,7 +36,19 @@ class ExceptionHandler implements EventSubscriberInterface ...@@ -34,7 +36,19 @@ class ExceptionHandler implements EventSubscriberInterface
{ {
$handler = new DebugExceptionHandler($this->debug); $handler = new DebugExceptionHandler($this->debug);
$event->setResponse($handler->createResponse($event->getException())); if (method_exists($handler, 'getHtml')) {
$exception = $event->getException();
if (!$exception instanceof FlattenException) {
$exception = FlattenException::create($exception);
}
$response = Response::create($handler->getHtml($exception), $exception->getStatusCode(), $exception->getHeaders())->setCharset(ini_get('default_charset'));
} else {
// BC with Symfony < 2.8
$response = $handler->createResponse($event->getException());
}
$event->setResponse($response);
} }
/** /**
......
...@@ -103,7 +103,7 @@ class SwiftmailerServiceProvider implements ServiceProviderInterface, EventListe ...@@ -103,7 +103,7 @@ class SwiftmailerServiceProvider implements ServiceProviderInterface, EventListe
$onTerminate = function ($event) use ($app) { $onTerminate = function ($event) use ($app) {
// To speed things up (by avoiding Swift Mailer initialization), flush // To speed things up (by avoiding Swift Mailer initialization), flush
// messages only if our mailer has been created (potentially used) // messages only if our mailer has been created (potentially used)
if ($app['mailer.initialized']) { if ($app['mailer.initialized'] && $app['swiftmailer.use_spool'] && $app['swiftmailer.spooltransport'] instanceof \Swift_Transport_SpoolTransport) {
$app['swiftmailer.spooltransport']->getSpool()->flushQueue($app['swiftmailer.transport']); $app['swiftmailer.spooltransport']->getSpool()->flushQueue($app['swiftmailer.transport']);
} }
}; };
......
...@@ -507,7 +507,7 @@ class ApplicationTest extends \PHPUnit_Framework_TestCase ...@@ -507,7 +507,7 @@ class ApplicationTest extends \PHPUnit_Framework_TestCase
{ {
$app = new Application(); $app = new Application();
ErrorHandler::register(); ErrorHandler::register(null, false);
$app['monolog.logfile'] = 'php://memory'; $app['monolog.logfile'] = 'php://memory';
$app->register(new MonologServiceProvider()); $app->register(new MonologServiceProvider());
$app->get('/foo/', function () { return 'ok'; }); $app->get('/foo/', function () { return 'ok'; });
......
...@@ -46,8 +46,8 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase ...@@ -46,8 +46,8 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
return $extensions; return $extensions;
}); });
$form = $app['form.factory']->createBuilder('form', array()) $form = $app['form.factory']->createBuilder(class_exists('Symfony\Component\Form\Extension\Core\Type\RangeType') ? 'Symfony\Component\Form\Extension\Core\Type\FormType' : 'form', array())
->add('dummy', 'dummy') ->add('dummy', class_exists('Symfony\Component\Form\Extension\Core\Type\RangeType') ? 'Silex\Tests\Provider\DummyFormType' : 'dummy')
->getForm(); ->getForm();
$this->assertInstanceOf('Symfony\Component\Form\Form', $form); $this->assertInstanceOf('Symfony\Component\Form\Form', $form);
...@@ -65,8 +65,8 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase ...@@ -65,8 +65,8 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
return $extensions; return $extensions;
}); });
$form = $app['form.factory']->createBuilder('form', array()) $form = $app['form.factory']->createBuilder(class_exists('Symfony\Component\Form\Extension\Core\Type\RangeType') ? 'Symfony\Component\Form\Extension\Core\Type\FormType' : 'form', array())
->add('file', 'file', array('image_path' => 'webPath')) ->add('file', class_exists('Symfony\Component\Form\Extension\Core\Type\RangeType') ? 'Symfony\Component\Form\Extension\Core\Type\FileType' : 'file', array('image_path' => 'webPath'))
->getForm(); ->getForm();
$this->assertInstanceOf('Symfony\Component\Form\Form', $form); $this->assertInstanceOf('Symfony\Component\Form\Form', $form);
...@@ -106,7 +106,7 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase ...@@ -106,7 +106,7 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
return $this->getMock('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface'); return $this->getMock('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface');
}; };
$form = $app['form.factory']->createBuilder('form', array()) $form = $app['form.factory']->createBuilder(class_exists('Symfony\Component\Form\Extension\Core\Type\RangeType') ? 'Symfony\Component\Form\Extension\Core\Type\FormType' : 'form', array())
->getForm(); ->getForm();
$form->handleRequest($req = Request::create('/', 'POST', array('form' => array( $form->handleRequest($req = Request::create('/', 'POST', array('form' => array(
...@@ -159,8 +159,13 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase ...@@ -159,8 +159,13 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
} }
} }
class DummyFormType extends AbstractType if (class_exists('Symfony\Component\Form\Extension\Core\Type\RangeType')) {
{ class DummyFormType extends AbstractType
{
}
} else {
class DummyFormType extends AbstractType
{
/** /**
* @return string The name of this type * @return string The name of this type
*/ */
...@@ -168,6 +173,7 @@ class DummyFormType extends AbstractType ...@@ -168,6 +173,7 @@ class DummyFormType extends AbstractType
{ {
return 'dummy'; return 'dummy';
} }
}
} }
if (method_exists('Symfony\Component\Form\AbstractType', 'configureOptions')) { if (method_exists('Symfony\Component\Form\AbstractType', 'configureOptions')) {
...@@ -175,7 +181,7 @@ if (method_exists('Symfony\Component\Form\AbstractType', 'configureOptions')) { ...@@ -175,7 +181,7 @@ if (method_exists('Symfony\Component\Form\AbstractType', 'configureOptions')) {
{ {
public function getExtendedType() public function getExtendedType()
{ {
return 'file'; return class_exists('Symfony\Component\Form\Extension\Core\Type\RangeType') ? 'Symfony\Component\Form\Extension\Core\Type\FileType' : 'file';
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
...@@ -188,7 +194,7 @@ if (method_exists('Symfony\Component\Form\AbstractType', 'configureOptions')) { ...@@ -188,7 +194,7 @@ if (method_exists('Symfony\Component\Form\AbstractType', 'configureOptions')) {
{ {
public function getExtendedType() public function getExtendedType()
{ {
return 'file'; return class_exists('Symfony\Component\Form\Extension\Core\Type\RangeType') ? 'Symfony\Component\Form\Extension\Core\Type\FileType' : 'file';
} }
public function setDefaultOptions(OptionsResolverInterface $resolver) public function setDefaultOptions(OptionsResolverInterface $resolver)
......
...@@ -88,7 +88,7 @@ class ValidatorServiceProviderTest extends \PHPUnit_Framework_TestCase ...@@ -88,7 +88,7 @@ class ValidatorServiceProviderTest extends \PHPUnit_Framework_TestCase
/** /**
* @depends testRegister * @depends testRegister
* @dataProvider testValidatorConstraintProvider * @dataProvider getTestValidatorConstraintProvider
*/ */
public function testValidatorConstraint($email, $isValid, $nbGlobalError, $nbEmailError, $app) public function testValidatorConstraint($email, $isValid, $nbGlobalError, $nbEmailError, $app)
{ {
...@@ -99,12 +99,12 @@ class ValidatorServiceProviderTest extends \PHPUnit_Framework_TestCase ...@@ -99,12 +99,12 @@ class ValidatorServiceProviderTest extends \PHPUnit_Framework_TestCase
), ),
)); ));
$builder = $app['form.factory']->createBuilder('form', array(), array( $builder = $app['form.factory']->createBuilder(class_exists('Symfony\Component\Form\Extension\Core\Type\RangeType') ? 'Symfony\Component\Form\Extension\Core\Type\FormType' : 'form', array(), array(
'constraints' => $constraints, 'constraints' => $constraints,
)); ));
$form = $builder $form = $builder
->add('email', 'email', array('label' => 'Email')) ->add('email', class_exists('Symfony\Component\Form\Extension\Core\Type\RangeType') ? 'Symfony\Component\Form\Extension\Core\Type\EmailType' : 'email', array('label' => 'Email'))
->getForm() ->getForm()
; ;
...@@ -136,9 +136,9 @@ class ValidatorServiceProviderTest extends \PHPUnit_Framework_TestCase ...@@ -136,9 +136,9 @@ class ValidatorServiceProviderTest extends \PHPUnit_Framework_TestCase
} }
} }
public function testValidatorConstraintProvider() public function getTestValidatorConstraintProvider()
{ {
// Email, form is valid , nb global error, nb email error // Email, form is valid, nb global error, nb email error
return array( return array(
array('', false, 0, 1), array('', false, 0, 1),
array('not an email', false, 0, 1), array('not an email', false, 0, 1),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment