Commit d74cb1f9 authored by Fabien Potencier's avatar Fabien Potencier

Merge branch '1.2'

* 1.2:
  fixed CS
  Update session.rst
  updated docs and changelog
  Add  parameter for application middlewares (before, after, finish)
  updated docs and changelog
  allow to register form types without extensions

Conflicts:
	src/Silex/Provider/FormServiceProvider.php
	tests/Silex/Tests/Provider/FormServiceProviderTest.php
parents 8de8331e 81a08269
...@@ -12,7 +12,8 @@ Changelog ...@@ -12,7 +12,8 @@ Changelog
1.2.2 (2014-XX-XX) 1.2.2 (2014-XX-XX)
------------------ ------------------
* n/a * added support for the $app argument in application middlewares (to make it consistent with route middlewares)
* added form.types to the Form provider
1.2.1 (2014-07-01) 1.2.1 (2014-07-01)
------------------ ------------------
......
...@@ -20,7 +20,7 @@ Before Middleware ...@@ -20,7 +20,7 @@ Before Middleware
A *before* application middleware allows you to tweak the Request before the A *before* application middleware allows you to tweak the Request before the
controller is executed:: controller is executed::
$app->before(function (Request $request) { $app->before(function (Request $request, Application $app) {
// ... // ...
}); });
...@@ -30,7 +30,7 @@ If you want your middleware to be run even if an exception is thrown early on ...@@ -30,7 +30,7 @@ If you want your middleware to be run even if an exception is thrown early on
(on a 404 or 403 error for instance), then, you need to register it as an (on a 404 or 403 error for instance), then, you need to register it as an
early event:: early event::
$app->before(function (Request $request) { $app->before(function (Request $request, Application $app) {
// ... // ...
}, Application::EARLY_EVENT); }, Application::EARLY_EVENT);
......
...@@ -172,6 +172,14 @@ form by adding constraints on the fields:: ...@@ -172,6 +172,14 @@ form by adding constraints on the fields::
)) ))
->getForm(); ->getForm();
You can register form types by extending ``form.types``::
$app['form.types'] = $app->share($app->extend('form.types', function ($types) use ($app) {
$types[] = new YourFormType();
return $types;
}));
You can register form extensions by extending ``form.extensions``:: You can register form extensions by extending ``form.extensions``::
$app->extend('form.extensions', function ($extensions) use ($app) { $app->extend('form.extensions', function ($extensions) use ($app) {
......
...@@ -26,8 +26,8 @@ Parameters ...@@ -26,8 +26,8 @@ Parameters
* **cookie_secure**: Cookie secure (HTTPS) * **cookie_secure**: Cookie secure (HTTPS)
* **cookie_httponly**: Whether the cookie is http only * **cookie_httponly**: Whether the cookie is http only
However, all of these are optional. Sessions last as long as the browser is However, all of these are optional. Default Sessions life time is 1800
open. To override this, set the ``lifetime`` option. seconds (30 minutes). To override this, set the ``lifetime`` option.
For a full list of available options, read the `PHP For a full list of available options, read the `PHP
<http://php.net/session.configuration>`_ official documentation. <http://php.net/session.configuration>`_ official documentation.
......
...@@ -294,7 +294,7 @@ class Application extends Container implements HttpKernelInterface, TerminableIn ...@@ -294,7 +294,7 @@ class Application extends Container implements HttpKernelInterface, TerminableIn
return; return;
} }
$ret = call_user_func($app['callback_resolver']->resolveCallback($callback), $event->getRequest()); $ret = call_user_func($app['callback_resolver']->resolveCallback($callback), $event->getRequest(), $app);
if ($ret instanceof Response) { if ($ret instanceof Response) {
$event->setResponse($ret); $event->setResponse($ret);
...@@ -320,7 +320,7 @@ class Application extends Container implements HttpKernelInterface, TerminableIn ...@@ -320,7 +320,7 @@ class Application extends Container implements HttpKernelInterface, TerminableIn
return; return;
} }
call_user_func($app['callback_resolver']->resolveCallback($callback), $event->getRequest(), $event->getResponse()); call_user_func($app['callback_resolver']->resolveCallback($callback), $event->getRequest(), $event->getResponse(), $app);
}, $priority); }, $priority);
} }
...@@ -338,7 +338,7 @@ class Application extends Container implements HttpKernelInterface, TerminableIn ...@@ -338,7 +338,7 @@ class Application extends Container implements HttpKernelInterface, TerminableIn
$app = $this; $app = $this;
$this->on(KernelEvents::TERMINATE, function (PostResponseEvent $event) use ($callback, $app) { $this->on(KernelEvents::TERMINATE, function (PostResponseEvent $event) use ($callback, $app) {
call_user_func($app['callback_resolver']->resolveCallback($callback), $event->getRequest(), $event->getResponse()); call_user_func($app['callback_resolver']->resolveCallback($callback), $event->getRequest(), $event->getResponse(), $app);
}, $priority); }, $priority);
} }
......
...@@ -47,6 +47,10 @@ class FormServiceProvider implements ServiceProviderInterface ...@@ -47,6 +47,10 @@ class FormServiceProvider implements ServiceProviderInterface
$app['form.secret'] = md5(__DIR__); $app['form.secret'] = md5(__DIR__);
$app['form.types'] = function ($app) {
return array();
};
$app['form.type.extensions'] = function ($app) { $app['form.type.extensions'] = function ($app) {
return array(); return array();
}; };
...@@ -84,6 +88,7 @@ class FormServiceProvider implements ServiceProviderInterface ...@@ -84,6 +88,7 @@ class FormServiceProvider implements ServiceProviderInterface
$app['form.factory'] = function ($app) { $app['form.factory'] = function ($app) {
return Forms::createFormFactoryBuilder() return Forms::createFormFactoryBuilder()
->addExtensions($app['form.extensions']) ->addExtensions($app['form.extensions'])
->addTypes($app['form.types'])
->addTypeExtensions($app['form.type.extensions']) ->addTypeExtensions($app['form.type.extensions'])
->addTypeGuessers($app['form.type.guessers']) ->addTypeGuessers($app['form.type.guessers'])
->setResolvedTypeFactory($app['form.resolved_type_factory']) ->setResolvedTypeFactory($app['form.resolved_type_factory'])
......
...@@ -233,4 +233,61 @@ class MiddlewareTest extends \PHPUnit_Framework_TestCase ...@@ -233,4 +233,61 @@ class MiddlewareTest extends \PHPUnit_Framework_TestCase
$request = Request::create('/'); $request = Request::create('/');
$this->assertEquals('foo---', $app->handle($request)->getContent()); $this->assertEquals('foo---', $app->handle($request)->getContent());
} }
public function testRouteAndApplicationMiddlewareParameterInjection()
{
$app = new Application();
$test = $this;
$middlewareTarget = array();
$applicationBeforeMiddleware = function ($request, $app) use (&$middlewareTarget, $test) {
$test->assertInstanceOf('\Symfony\Component\HttpFoundation\Request', $request);
$test->assertInstanceOf('\Silex\Application', $app);
$middlewareTarget[] = 'application_before_middleware_triggered';
};
$applicationAfterMiddleware = function ($request, $response, $app) use (&$middlewareTarget, $test){
$test->assertInstanceOf('\Symfony\Component\HttpFoundation\Request', $request);
$test->assertInstanceOf('\Symfony\Component\HttpFoundation\Response', $response);
$test->assertInstanceOf('\Silex\Application', $app);
$middlewareTarget[] = 'application_after_middleware_triggered';
};
$applicationFinishMiddleware = function ($request, $response, $app) use (&$middlewareTarget, $test){
$test->assertInstanceOf('\Symfony\Component\HttpFoundation\Request', $request);
$test->assertInstanceOf('\Symfony\Component\HttpFoundation\Response', $response);
$test->assertInstanceOf('\Silex\Application', $app);
$middlewareTarget[] = 'application_finish_middleware_triggered';
};
$routeBeforeMiddleware = function ($request, $app) use (&$middlewareTarget, $test) {
$test->assertInstanceOf('\Symfony\Component\HttpFoundation\Request', $request);
$test->assertInstanceOf('\Silex\Application', $app);
$middlewareTarget[] = 'route_before_middleware_triggered';
};
$routeAfterMiddleware = function ($request, $response, $app) use (&$middlewareTarget, $test){
$test->assertInstanceOf('\Symfony\Component\HttpFoundation\Request', $request);
$test->assertInstanceOf('\Symfony\Component\HttpFoundation\Response', $response);
$test->assertInstanceOf('\Silex\Application', $app);
$middlewareTarget[] = 'route_after_middleware_triggered';
};
$app->before($applicationBeforeMiddleware);
$app->after($applicationAfterMiddleware);
$app->finish($applicationFinishMiddleware);
$app->match('/', function () {
return new Response('foo');
})
->before($routeBeforeMiddleware)
->after($routeAfterMiddleware);
$request = Request::create('/');
$response = $app->handle($request);
$app->terminate($request, $response);
$this->assertSame(array('application_before_middleware_triggered', 'route_before_middleware_triggered', 'route_after_middleware_triggered', 'application_after_middleware_triggered', 'application_finish_middleware_triggered'), $middlewareTarget);
}
} }
...@@ -14,6 +14,7 @@ namespace Silex\Tests\Provider; ...@@ -14,6 +14,7 @@ namespace Silex\Tests\Provider;
use Silex\Application; use Silex\Application;
use Silex\Provider\FormServiceProvider; use Silex\Provider\FormServiceProvider;
use Silex\Provider\TranslationServiceProvider; use Silex\Provider\TranslationServiceProvider;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface; use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface;
use Symfony\Component\Form\FormTypeGuesserChain; use Symfony\Component\Form\FormTypeGuesserChain;
...@@ -29,6 +30,25 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase ...@@ -29,6 +30,25 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
$this->assertInstanceOf('Symfony\Component\Form\FormFactory', $app['form.factory']); $this->assertInstanceOf('Symfony\Component\Form\FormFactory', $app['form.factory']);
} }
public function testFormServiceProviderWillLoadTypes()
{
$app = new Application();
$app->register(new FormServiceProvider());
$app->extend('form.types', function ($extensions) {
$extensions[] = new DummyFormType();
return $extensions;
});
$form = $app['form.factory']->createBuilder('form', array())
->add('dummy', 'dummy')
->getForm();
$this->assertInstanceOf('Symfony\Component\Form\Form', $form);
}
public function testFormServiceProviderWillLoadTypeExtensions() public function testFormServiceProviderWillLoadTypeExtensions()
{ {
$app = new Application(); $app = new Application();
...@@ -73,8 +93,8 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase ...@@ -73,8 +93,8 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
'messages' => array( 'messages' => array(
'de' => array ( 'de' => array (
'The CSRF token is invalid. Please try to resubmit the form.' => 'German translation', 'The CSRF token is invalid. Please try to resubmit the form.' => 'German translation',
) ),
) ),
); );
$app['locale'] = 'de'; $app['locale'] = 'de';
...@@ -86,7 +106,7 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase ...@@ -86,7 +106,7 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
->getForm(); ->getForm();
$form->handleRequest($req = Request::create('/', 'POST', array('form' => array( $form->handleRequest($req = Request::create('/', 'POST', array('form' => array(
'_token' => 'the wrong token' '_token' => 'the wrong token',
)))); ))));
$this->assertFalse($form->isValid()); $this->assertFalse($form->isValid());
...@@ -94,6 +114,17 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase ...@@ -94,6 +114,17 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
} }
} }
class DummyFormType extends AbstractType
{
/**
* @return string The name of this type
*/
public function getName()
{
return 'dummy';
}
}
class DummyFormTypeExtension extends AbstractTypeExtension class DummyFormTypeExtension extends AbstractTypeExtension
{ {
public function getExtendedType() public function getExtendedType()
......
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