Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Sign in
Toggle navigation
S
Silex
Project overview
Project overview
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
common
Silex
Commits
cfcfa143
Commit
cfcfa143
authored
Mar 31, 2016
by
skalpa
Committed by
Fabien Potencier
May 16, 2016
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add the possibility to register forms as services
parent
e2f16da9
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
283 additions
and
6 deletions
+283
-6
doc/providers/form.rst
doc/providers/form.rst
+13
-1
src/Silex/Provider/Form/SilexFormExtension.php
src/Silex/Provider/Form/SilexFormExtension.php
+122
-0
src/Silex/Provider/FormServiceProvider.php
src/Silex/Provider/FormServiceProvider.php
+5
-3
tests/Silex/Tests/Provider/FormServiceProviderTest.php
tests/Silex/Tests/Provider/FormServiceProviderTest.php
+143
-2
No files found.
doc/providers/form.rst
View file @
cfcfa143
...
@@ -142,8 +142,12 @@ form by adding constraints on the fields::
...
@@ -142,8 +142,12 @@ form by adding constraints on the fields::
You can register form types by extending ``form.types``::
You can register form types by extending ``form.types``::
$app['form.types'] = $app->share($app->extend('form.types', function ($types) use ($app) {
$app['your.type.service'] = function ($app) {
return new YourServiceFormType();
};
$app->extend('form.types', function ($types) use ($app) {
$types[] = new YourFormType();
$types[] = new YourFormType();
$types[] = 'your.type.service';
return $types;
return $types;
}));
}));
...
@@ -159,16 +163,24 @@ You can register form extensions by extending ``form.extensions``::
...
@@ -159,16 +163,24 @@ You can register form extensions by extending ``form.extensions``::
You can register form type extensions by extending ``form.type.extensions``::
You can register form type extensions by extending ``form.type.extensions``::
$app['your.type.extension.service'] = function ($app) {
return new YourServiceFormTypeExtension();
};
$app->extend('form.type.extensions', function ($extensions) use ($app) {
$app->extend('form.type.extensions', function ($extensions) use ($app) {
$extensions[] = new YourFormTypeExtension();
$extensions[] = new YourFormTypeExtension();
$extensions[] = 'your.type.extension.service';
return $extensions;
return $extensions;
});
});
You can register form type guessers by extending ``form.type.guessers``::
You can register form type guessers by extending ``form.type.guessers``::
$app['your.type.guesser.service'] = function ($app) {
return new YourServiceFormTypeGuesser();
};
$app->extend('form.type.guessers', function ($guessers) use ($app) {
$app->extend('form.type.guessers', function ($guessers) use ($app) {
$guessers[] = new YourFormTypeGuesser();
$guessers[] = new YourFormTypeGuesser();
$guessers[] = 'your.type.guesser.service';
return $guessers;
return $guessers;
});
});
...
...
src/Silex/Provider/Form/SilexFormExtension.php
0 → 100644
View file @
cfcfa143
<?php
/*
* This file is part of the Silex framework.
*
* (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
Silex\Provider\Form
;
use
Pimple\Container
;
use
Symfony\Component\Form\Exception\InvalidArgumentException
;
use
Symfony\Component\Form\FormExtensionInterface
;
use
Symfony\Component\Form\FormTypeGuesserChain
;
class
SilexFormExtension
implements
FormExtensionInterface
{
private
$app
;
private
$types
;
private
$typeExtensions
;
private
$guessers
;
private
$guesserLoaded
=
false
;
private
$guesser
;
public
function
__construct
(
Container
$app
,
array
$types
,
array
$typeExtensions
,
array
$guessers
)
{
$this
->
app
=
$app
;
$this
->
setTypes
(
$types
);
$this
->
setTypeExtensions
(
$typeExtensions
);
$this
->
setGuessers
(
$guessers
);
}
public
function
getType
(
$name
)
{
if
(
!
isset
(
$this
->
types
[
$name
]))
{
throw
new
InvalidArgumentException
(
sprintf
(
'The type "%s" is not the name of a registered form type.'
,
$name
));
}
if
(
!
is_object
(
$this
->
types
[
$name
]))
{
$this
->
types
[
$name
]
=
$this
->
app
[
$this
->
types
[
$name
]];
}
return
$this
->
types
[
$name
];
}
public
function
hasType
(
$name
)
{
return
isset
(
$this
->
types
[
$name
]);
}
public
function
getTypeExtensions
(
$name
)
{
return
isset
(
$this
->
typeExtensions
[
$name
])
?
$this
->
typeExtensions
[
$name
]
:
[];
}
public
function
hasTypeExtensions
(
$name
)
{
return
isset
(
$this
->
typeExtensions
[
$name
]);
}
public
function
getTypeGuesser
()
{
if
(
!
$this
->
guesserLoaded
)
{
$this
->
guesserLoaded
=
true
;
if
(
$this
->
guessers
)
{
$guessers
=
[];
foreach
(
$this
->
guessers
as
$guesser
)
{
if
(
!
is_object
(
$guesser
))
{
$guesser
=
$this
->
app
[
$guesser
];
}
$guessers
[]
=
$guesser
;
}
$this
->
guesser
=
new
FormTypeGuesserChain
(
$guessers
);
}
}
return
$this
->
guesser
;
}
private
function
setTypes
(
array
$types
)
{
$this
->
types
=
[];
foreach
(
$types
as
$type
)
{
if
(
!
is_object
(
$type
))
{
if
(
!
isset
(
$this
->
app
[
$type
]))
{
throw
new
InvalidArgumentException
(
sprintf
(
'Invalid form type. The silex service "%s" does not exist.'
,
$type
));
}
$this
->
types
[
$type
]
=
$type
;
}
else
{
$this
->
types
[
get_class
(
$type
)]
=
$type
;
}
}
}
private
function
setTypeExtensions
(
array
$typeExtensions
)
{
$this
->
typeExtensions
=
[];
foreach
(
$typeExtensions
as
$extension
)
{
if
(
!
is_object
(
$extension
))
{
if
(
!
isset
(
$this
->
app
[
$extension
]))
{
throw
new
InvalidArgumentException
(
sprintf
(
'Invalid form type extension. The silex service "%s" does not exist.'
,
$extension
));
}
$extension
=
$this
->
app
[
$extension
];
}
$this
->
typeExtensions
[
$extension
->
getExtendedType
()][]
=
$extension
;
}
}
private
function
setGuessers
(
array
$guessers
)
{
$this
->
guessers
=
[];
foreach
(
$guessers
as
$guesser
)
{
if
(
!
is_object
(
$guesser
)
&&
!
isset
(
$this
->
app
[
$guesser
]))
{
throw
new
InvalidArgumentException
(
sprintf
(
'Invalid form type guesser. The silex service "%s" does not exist.'
,
$guesser
));
}
$this
->
guessers
[]
=
$guesser
;
}
}
}
src/Silex/Provider/FormServiceProvider.php
View file @
cfcfa143
...
@@ -63,8 +63,13 @@ class FormServiceProvider implements ServiceProviderInterface
...
@@ -63,8 +63,13 @@ class FormServiceProvider implements ServiceProviderInterface
return
new
CsrfExtension
(
$app
[
'csrf.token_manager'
]);
return
new
CsrfExtension
(
$app
[
'csrf.token_manager'
]);
};
};
$app
[
'form.extension.silex'
]
=
function
(
$app
)
{
return
new
Form\SilexFormExtension
(
$app
,
$app
[
'form.types'
],
$app
[
'form.type.extensions'
],
$app
[
'form.type.guessers'
]);
};
$app
[
'form.extensions'
]
=
function
(
$app
)
{
$app
[
'form.extensions'
]
=
function
(
$app
)
{
$extensions
=
array
(
$extensions
=
array
(
$app
[
'form.extension.silex'
],
new
HttpFoundationExtension
(),
new
HttpFoundationExtension
(),
);
);
...
@@ -82,9 +87,6 @@ class FormServiceProvider implements ServiceProviderInterface
...
@@ -82,9 +87,6 @@ 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'
])
->
addTypeGuessers
(
$app
[
'form.type.guessers'
])
->
setResolvedTypeFactory
(
$app
[
'form.resolved_type_factory'
])
->
setResolvedTypeFactory
(
$app
[
'form.resolved_type_factory'
])
->
getFormFactory
()
->
getFormFactory
()
;
;
...
...
tests/Silex/Tests/Provider/FormServiceProviderTest.php
View file @
cfcfa143
...
@@ -53,6 +53,51 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
...
@@ -53,6 +53,51 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
$this
->
assertInstanceOf
(
'Symfony\Component\Form\Form'
,
$form
);
$this
->
assertInstanceOf
(
'Symfony\Component\Form\Form'
,
$form
);
}
}
public
function
testFormServiceProviderWillLoadTypesServices
()
{
$app
=
new
Application
();
$app
->
register
(
new
FormServiceProvider
());
$app
[
'dummy'
]
=
function
()
{
return
new
DummyFormType
();
};
$app
->
extend
(
'form.types'
,
function
(
$extensions
)
{
$extensions
[]
=
'dummy'
;
return
$extensions
;
});
$form
=
$app
[
'form.factory'
]
->
createBuilder
(
'Symfony\Component\Form\Extension\Core\Type\FormType'
,
array
())
->
add
(
'dummy'
,
'dummy'
)
->
getForm
();
$this
->
assertInstanceOf
(
'Symfony\Component\Form\Form'
,
$form
);
}
/**
* @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException
* @expectedExceptionMessage Invalid form type. The silex service "dummy" does not exist.
*/
public
function
testNonExistentTypeService
()
{
$app
=
new
Application
();
$app
->
register
(
new
FormServiceProvider
());
$app
->
extend
(
'form.types'
,
function
(
$extensions
)
{
$extensions
[]
=
'dummy'
;
return
$extensions
;
});
$app
[
'form.factory'
]
->
createBuilder
(
'Symfony\Component\Form\Extension\Core\Type\FormType'
,
array
())
->
add
(
'dummy'
,
'dummy'
)
->
getForm
();
}
public
function
testFormServiceProviderWillLoadTypeExtensions
()
public
function
testFormServiceProviderWillLoadTypeExtensions
()
{
{
$app
=
new
Application
();
$app
=
new
Application
();
...
@@ -72,6 +117,51 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
...
@@ -72,6 +117,51 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
$this
->
assertInstanceOf
(
'Symfony\Component\Form\Form'
,
$form
);
$this
->
assertInstanceOf
(
'Symfony\Component\Form\Form'
,
$form
);
}
}
public
function
testFormServiceProviderWillLoadTypeExtensionsServices
()
{
$app
=
new
Application
();
$app
->
register
(
new
FormServiceProvider
());
$app
[
'dummy.form.type.extension'
]
=
function
()
{
return
new
DummyFormTypeExtension
();
};
$app
->
extend
(
'form.type.extensions'
,
function
(
$extensions
)
{
$extensions
[]
=
'dummy.form.type.extension'
;
return
$extensions
;
});
$form
=
$app
[
'form.factory'
]
->
createBuilder
(
'Symfony\Component\Form\Extension\Core\Type\FormType'
,
array
())
->
add
(
'file'
,
'Symfony\Component\Form\Extension\Core\Type\FileType'
,
array
(
'image_path'
=>
'webPath'
))
->
getForm
();
$this
->
assertInstanceOf
(
'Symfony\Component\Form\Form'
,
$form
);
}
/**
* @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException
* @expectedExceptionMessage Invalid form type extension. The silex service "dummy.form.type.extension" does not exist.
*/
public
function
testNonExistentTypeExtensionService
()
{
$app
=
new
Application
();
$app
->
register
(
new
FormServiceProvider
());
$app
->
extend
(
'form.type.extensions'
,
function
(
$extensions
)
{
$extensions
[]
=
'dummy.form.type.extension'
;
return
$extensions
;
});
$app
[
'form.factory'
]
->
createBuilder
(
'Symfony\Component\Form\Extension\Core\Type\FormType'
,
array
())
->
add
(
'dummy'
,
'dummy.form.type'
)
->
getForm
();
}
public
function
testFormServiceProviderWillLoadTypeGuessers
()
public
function
testFormServiceProviderWillLoadTypeGuessers
()
{
{
$app
=
new
Application
();
$app
=
new
Application
();
...
@@ -87,6 +177,43 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
...
@@ -87,6 +177,43 @@ 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
testFormServiceProviderWillLoadTypeGuessersServices
()
{
$app
=
new
Application
();
$app
->
register
(
new
FormServiceProvider
());
$app
[
'dummy.form.type.guesser'
]
=
function
()
{
return
new
FormTypeGuesserChain
(
array
());
};
$app
->
extend
(
'form.type.guessers'
,
function
(
$guessers
)
{
$guessers
[]
=
'dummy.form.type.guesser'
;
return
$guessers
;
});
$this
->
assertInstanceOf
(
'Symfony\Component\Form\FormFactory'
,
$app
[
'form.factory'
]);
}
/**
* @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException
* @expectedExceptionMessage Invalid form type guesser. The silex service "dummy.form.type.guesser" does not exist.
*/
public
function
testNonExistentTypeGuesserService
()
{
$app
=
new
Application
();
$app
->
register
(
new
FormServiceProvider
());
$app
->
extend
(
'form.type.guessers'
,
function
(
$extensions
)
{
$extensions
[]
=
'dummy.form.type.guesser'
;
return
$extensions
;
});
$factory
=
$app
[
'form.factory'
];
}
public
function
testFormServiceProviderWillUseTranslatorIfAvailable
()
public
function
testFormServiceProviderWillUseTranslatorIfAvailable
()
{
{
$app
=
new
Application
();
$app
=
new
Application
();
...
@@ -159,8 +286,22 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
...
@@ -159,8 +286,22 @@ class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
}
}
}
}
class
DummyFormType
extends
AbstractType
if
(
!
class_exists
(
'Symfony\Component\Form\Deprecated\FormEvents'
))
{
{
class
DummyFormType
extends
AbstractType
{
}
}
else
{
// FormTypeInterface::getName() is needed by the form component 2.8.x
class
DummyFormType
extends
AbstractType
{
/**
* @return string The name of this type
*/
public
function
getName
()
{
return
'dummy'
;
}
}
}
}
if
(
method_exists
(
'Symfony\Component\Form\AbstractType'
,
'configureOptions'
))
{
if
(
method_exists
(
'Symfony\Component\Form\AbstractType'
,
'configureOptions'
))
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment