In meinem persönlichen Symfony3.2-Projekt möchte ich HtmlPurifier in mein UserProfile-Formular einfügen, um XSS-Angriffe zu verhindern.Symfony FosUserBundle und HTMLPurifierBundle
daher wie beschrieben in: https://github.com/Exercise/HTMLPurifierBundle modifizierte ich die UserProfileFormType
accorditly:
namespace AppUserBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
class UserProfileFormType extends AbstractType
{
private $purifierTransformer;
public function __construct(DataTransformerInterface $purifierTransformer)
{
$this->purifierTransformer = $purifierTransformer;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
$builder->addViewTransformer($this->purifierTransformer);
$builder->add('name',TextType::class,array('label'=>'profile.first_name','required' => false));
$builder->add('surname',TextType::class,array('label'=>'profile.surnname','required' => false));
$builder->remove('username');
$builder->add('username',TextType::class,['required' => false]);
$builder->add('email',TextType::class,['required' => false]);
$builder->add('description',TextareaType::class,['required' => false]);
$builder->remove('current_password');
}
public function getParent()
{
return 'FOS\UserBundle\Form\Type\ProfileFormType';
}
public function getBlockPrefix()
{
return 'app_user_profile';
}
// For Symfony 2.x
public function getName()
{
return $this->getBlockPrefix();
}
}
Und auch verwendet, um diese Einträge in services.yml
Einträge:
services:
app_user.html_purifier:
class: Exercise\HTMLPurifierBundle\Form\HTMLPurifierTransformer
arguments: ["@exercise_html_purifier.default"]
app_user.user_profile_form:
class: AppUserBundle\Form\Type\UserProfileFormType
arguments: ["@app_user.html_purifier"]
tags:
- { name: form.type, alias: app_user_profile }
Auch habe ich diese Einträge in config.yml
:
fos_user:
db_driver: orm # other valid values are 'mongodb' and 'couchdb'
firewall_name: main
user_class: '%user_class%'
from_email:
address: "[email protected]"
sender_name: "App Mailer"
registration:
confirmation:
enabled: false
profile:
form:
type: AppUserBundle\Form\Type\UserProfileFormType
exercise_html_purifier:
default:
Cache.SerializerPath: '%kernel.cache_dir%/htmlpurifier'
Mit diesen Optionen, die ich die folgende Fehlermeldung erhalten:
Type error: Argument 1 passed to AppUserBundle\Form\Type\UserProfileFormType::__construct() must be an instance of Symfony\Component\Form\DataTransformerInterface, none given, called in /home/pcmagas/Kwdikas/php/apps/symfonyAdminLTE/vendor/symfony/symfony/src/Symfony/Component/Form/FormRegistry.php on line 85
Ich habe auch versucht, in src/AppUserBundle/Resources/config.yml
den folgenden Wert zu ändern:
fos_user:
#Some configuration
profile:
form:
type: AppUserBundle\Form\Type\UserProfileFormType
Mit dieser:
fos_user #Some Konfiguration profil: form: typ: app_user.user_profile_form
dass der folgende Fehler zurückgegeben:
Could not load type "app_user.user_profile_form"
Haben Sie eine Ahnung, wie ich dieses lösen? Solange ich das Problem verstehe ist, dass der FosUserBundle den richtigen Dienst irgendwie nicht laden kann. Hast du eine Idee, wie ich sagen werde, um den passenden Dienst für die Konfiguration zu laden?
Edit 1:
Auf UserProfileFormType
Methode ersetzt ich das:
$builder->add('description',TextareaType::class,['required' => false]);
mit:
$builder->add('description',PurifiedTextAreaType::class,['required' => false]);
Und ich habe den folgenden Fehler:
Type error: Argument 1 passed to AppUserBundle\Form\Type\PurifiedTextAreaType::__construct() must implement interface Symfony\Component\Form\DataTransformerInterface, none given, called in /home/pcmagas/Kwdikas/php/apps/symfonyAdminLTE/var/cache/dev/appDevDebugProjectContainer.php on line 389
Bitte halten im Hinterkopf Ich habe die AppUserBundle/Form/Type/PurifiedTextAreaType.php
:
namespace AppUserBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class PurifiedTextAreaType extends AbstractType
{
private $purifierTransformer;
public function __construct(DataTransformerInterface $purifierTransformer)
{
$this->purifierTransformer = $purifierTransformer;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addViewTransformer($this->purifierTransformer);
}
public function getParent()
{
return 'textarea';
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'compound' => false,
));
}
public function getName()
{
return 'purified_textarea';
}
}
Ich vergaß zu erwähnen, dass auch ich ein anderes Bündel verwenden, um jede Art von Benutzerverwaltung zu tun und AppUserBudnle
alle benutzerdefinierte Formulare in diesem Bundle namens Handhabung sind.
geben Sie ne Ihre Rückmeldung – Timan
Welche Art von Feedback? –