2017-05-16 2 views
0

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.

+0

geben Sie ne Ihre Rückmeldung – Timan

+0

Welche Art von Feedback? –

Antwort

1

Ich denke, dass der beste Weg, um diese Erweiterung zu verwenden, wie in der Anleitung beschrieben ist, mit einem einzigen Textarea, die Sie in Ihrer endgültigen Form als eigene TextAreaType anrufen:

ich diesen Fehler in Ihrer Beschreibung zu sehen Es gibt den Namespace, aber der Klassenname "UserProfileFormType" fehlt.

services: 
    app_user.user_profile_form: 
    class: AppUserBundle\Form\Type 
    arguments: ["@app_user.html_purifier"] 
    tags: 
     - { name: form.type, alias: app_user_profile } 

In dieser Konfiguration

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 

Sie Profil Formulartyp überschreiben müssen und es dann beim Namen nennen statt durch Klassennamen (die Sie ohne Argument bilden können konstruieren):

a Haben schaue dort: http://symfony.com/doc/current/bundles/FOSUserBundle/overriding_forms.html#overriding-a-form-type

+0

Vielen Dank für die typografische Miustake –

+0

Entschuldigung für spät, rufen Sie Ihren Formulartyp mit Namen – Timan

0

Wie Manuel DUVERNON sagt, am Ende habe ich diesen FormType erstellt, der eine HtmlPurified TextArea darstellt:

namespace AppUserBundle\Form\Type; 


use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\DataTransformerInterface; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
use Exercise\HTMLPurifierBundle\Form\HTMLPurifierTransformer; 
use HTMLPurifier; 

class PurifiedTextAreaType extends AbstractType 
{ 
    private $purifierTransformer; 

    /** 
    * I Do not Dependency Inject the HtmlPurifier because I want to Use it as 
    * FormType in FosUserBundle's extended forms in the wat that is described in: 
    * https://symfony.com/doc/master/bundles/FOSUserBundle/overriding_forms.html 
    * 
    * And the method described above does not favour Dependency Injection. 
    */ 
    public function __construct() 
    { 
     $this->purifierTransformer = new HTMLPurifierTransformer(new \HTMLPurifier()); 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->addViewTransformer($this->purifierTransformer); 
    } 

    public function getParent() 
    { 
     return 'Symfony\Component\Form\Extension\Core\Type\TextareaType'; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
       'compound' => false, 
     )); 
    } 

    public function getName() 
    { 
     return 'purified_textarea'; 
    } 
} 

Bitte beachten Sie die HTMLPurifierTransformer über Dependency Injection zu laden nicht, weil die FosUserBundle der Formbuilder kann die erweiterte Form über Dependency Injection laden. Denken Sie auch daran, den Namespace des FormType zu verwenden, den Sie erweitern (in meinem Fall Symfony\Component\Form\Extension\Core\Type\TextareaType), da FormBuilder auch eine Beschränkung auf eine bestimmte Schnittstelle hat.

Verwandte Themen