1919use Symfony \Component \Form \FormInterface ;
2020use Symfony \Component \Form \FormView ;
2121use Symfony \Component \Form \Util \ServerParams ;
22+ use Symfony \Component \OptionsResolver \Options ;
2223use Symfony \Component \OptionsResolver \OptionsResolver ;
2324use Symfony \Component \Security \Csrf \CsrfTokenManagerInterface ;
2425use Symfony \Contracts \Translation \TranslatorInterface ;
@@ -35,6 +36,8 @@ public function __construct(
3536 private ?TranslatorInterface $ translator = null ,
3637 private ?string $ translationDomain = null ,
3738 private ?ServerParams $ serverParams = null ,
39+ private array $ fieldAttr = [],
40+ private ?string $ defaultTokenId = null ,
3841 ) {
3942 }
4043
@@ -73,6 +76,7 @@ public function finishView(FormView $view, FormInterface $form, array $options):
7376 $ csrfForm = $ factory ->createNamed ($ options ['csrf_field_name ' ], HiddenType::class, $ data , [
7477 'block_prefix ' => 'csrf_token ' ,
7578 'mapped ' => false ,
79+ 'attr ' => $ this ->fieldAttr + ['autocomplete ' => 'off ' ],
7680 ]);
7781
7882 $ view ->children [$ options ['csrf_field_name ' ]] = $ csrfForm ->createView ($ view );
@@ -81,13 +85,24 @@ public function finishView(FormView $view, FormInterface $form, array $options):
8185
8286 public function configureOptions (OptionsResolver $ resolver ): void
8387 {
88+ if ($ defaultTokenId = $ this ->defaultTokenId ) {
89+ $ defaultTokenManager = $ this ->defaultTokenManager ;
90+ $ defaultTokenId = static fn (Options $ options ) => $ options ['csrf_token_manager ' ] === $ defaultTokenManager ? $ defaultTokenId : null ;
91+ }
92+
8493 $ resolver ->setDefaults ([
8594 'csrf_protection ' => $ this ->defaultEnabled ,
8695 'csrf_field_name ' => $ this ->defaultFieldName ,
8796 'csrf_message ' => 'The CSRF token is invalid. Please try to resubmit the form. ' ,
8897 'csrf_token_manager ' => $ this ->defaultTokenManager ,
89- 'csrf_token_id ' => null ,
98+ 'csrf_token_id ' => $ defaultTokenId ,
9099 ]);
100+
101+ $ resolver ->setAllowedTypes ('csrf_protection ' , 'bool ' );
102+ $ resolver ->setAllowedTypes ('csrf_field_name ' , 'string ' );
103+ $ resolver ->setAllowedTypes ('csrf_message ' , 'string ' );
104+ $ resolver ->setAllowedTypes ('csrf_token_manager ' , CsrfTokenManagerInterface::class);
105+ $ resolver ->setAllowedTypes ('csrf_token_id ' , ['null ' , 'string ' ]);
91106 }
92107
93108 public static function getExtendedTypes (): iterable
0 commit comments