Commit 7c38c9a8 authored by Dave Marshall's avatar Dave Marshall Committed by Fabien Potencier

Add services allowing for form type extensions and guessers

parent fcd93b34
......@@ -7,7 +7,7 @@ env:
before_script:
# symfony/*
- sh -c "if [ '$SYMFONY_DEPS_VERSION' = '2.2' ]; then sed -i 's/>=2.1,<2.3-dev/2.2.*@dev/g' composer.json; composer require --no-update 'symfony/property-access:2.2.*@dev'; composer update --dev --prefer-source; fi"
- sh -c "if [ '$SYMFONY_DEPS_VERSION' = '2.1' ]; then sed -i 's/>=2.1,<2.3-dev/2.1.*@dev/g' composer.json; composer update --dev --prefer-source; fi"
- sh -c "if [ '$SYMFONY_DEPS_VERSION' = '2.1' ]; then sed -i 's/>=2.1\(.[0-9]\+\)\?,<2.3-dev/2.1.*@dev/g' composer.json; composer update --dev --prefer-source; fi"
- composer install --dev --prefer-source
php:
......
......@@ -26,7 +26,7 @@
"symfony/security": ">=2.1,<2.3-dev",
"symfony/config": ">=2.1,<2.3-dev",
"symfony/locale": ">=2.1,<2.3-dev",
"symfony/form": ">=2.1,<2.3-dev",
"symfony/form": ">=2.1.4,<2.3-dev",
"symfony/browser-kit": ">=2.1,<2.3-dev",
"symfony/css-selector": ">=2.1,<2.3-dev",
"symfony/dom-crawler": ">=2.1,<2.3-dev",
......@@ -45,7 +45,8 @@
"suggest": {
"symfony/browser-kit": ">=2.1,<2.3-dev",
"symfony/css-selector": ">=2.1,<2.3-dev",
"symfony/dom-crawler": ">=2.1,<2.3-dev"
"symfony/dom-crawler": ">=2.1,<2.3-dev",
"symfony/form": "To make use of the FormServiceProvider, >= 2.1.4 is required"
},
"autoload": {
"psr-0": { "Silex": "src/" }
......
......@@ -55,7 +55,7 @@ Registering
.. code-block:: json
"require": {
"symfony/form": "~2.1"
"symfony/form": "~2.1.4"
}
If you are going to use the validation extension with forms, you must also
......@@ -170,6 +170,23 @@ You can register form extensions by extending ``form.extensions``::
return $extensions;
}));
You can register form type extensions by extending ``form.type.extensions``::
$app['form.type.extensions'] = $app->share($app->extend('form.type.extensions', function ($extensions) use ($app) {
$extensions[] = new YourFormTypeExtension();
return $extensions;
}));
You can register form type guessers by extending ``form.type.guessers``::
$app['form.type.guessers'] = $app->share($app->extend('form.type.guessers', function ($guessers) use ($app) {
$guessers[] = new YourFormTypeGuesser();
return $guessers;
}));
Traits
------
......
......@@ -18,6 +18,7 @@ use Symfony\Component\Form\Extension\Csrf\CsrfProvider\DefaultCsrfProvider;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider;
use Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension;
use Symfony\Component\Form\Extension\Validator\ValidatorExtension as FormValidatorExtension;
use Symfony\Component\Form\FormTypeGuesserChain;
use Symfony\Component\Form\Forms;
/**
......@@ -46,6 +47,14 @@ class FormServiceProvider implements ServiceProviderInterface
$app['form.secret'] = md5(__DIR__);
$app['form.type.extensions'] = $app->share(function ($app) {
return array();
});
$app['form.type.guessers'] = $app->share(function ($app) {
return array();
});
$app['form.extensions'] = $app->share(function ($app) {
$extensions = array(
new CsrfExtension($app['form.csrf_provider']),
......@@ -67,6 +76,8 @@ class FormServiceProvider implements ServiceProviderInterface
$app['form.factory'] = $app->share(function ($app) {
return Forms::createFormFactoryBuilder()
->addExtensions($app['form.extensions'])
->addTypeExtensions($app['form.type.extensions'])
->addTypeGuessers($app['form.type.guessers'])
->getFormFactory()
;
});
......
<?php
/*
* This file is part of the Silex framework.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Silex\Tests\Provider;
use Silex\Application;
use Silex\Provider\FormServiceProvider;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormTypeGuesserChain;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
{
public function testFormFactoryServiceIsFormFactory()
{
$app = new Application();
$app->register(new FormServiceProvider());
$this->assertInstanceOf('Symfony\Component\Form\FormFactory', $app['form.factory']);
}
public function testFormServiceProviderWillLoadTypeExtensions()
{
$app = new Application();
$app->register(new FormServiceProvider());
$app['form.type.extensions'] = $app->share($app->extend('form.type.extensions', function($extensions) {
$extensions[] = new DummyFormTypeExtension();
return $extensions;
}));
$form = $app['form.factory']->createBuilder('form', array())
->add('file', 'file', array('image_path' => 'webPath'))
->getForm();
$this->assertInstanceOf('Symfony\Component\Form\Form', $form);
}
public function testFormServiceProviderWillLoadTypeGuessers()
{
$app = new Application();
$app->register(new FormServiceProvider());
$app['form.type.guessers'] = $app->share($app->extend('form.type.guessers', function($guessers) {
$guessers[] = new FormTypeGuesserChain(array());
return $guessers;
}));
$this->assertInstanceOf('Symfony\Component\Form\FormFactory', $app['form.factory']);
}
}
class DummyFormTypeExtension extends AbstractTypeExtension
{
public function getExtendedType()
{
return 'file';
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setOptional(array('image_path'));
}
}
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