2016-12-20 3 views
1

Wie Übergeben von Parametern zu benutzerdefiniertem Formulartyp in Controller mit CreateForm-Methode in Symfony3? Der Parameter ist "type" In BannerType.php:Warnung: Fehlendes Argument 1 für BannerType :: __ construct()

public function __construct($type){ 
    $this->type = $type; 
} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Banner\BannerBundle\Entity\Banner', 
     'type' => null, 
    )); 
} 

In BannerController.php:

$form = $this->createForm(BannerType::class, $entity, array(
    'typee' => $type, 
)); 
+1

Sie haben im createForm-Parameter einen Tippfehler: 'typee' anstelle von 'type'. – Starspire

+1

Danke, aber es ist ein Tippfehler Kein Einfluss – mahdi

Antwort

0

Sie passieren kein Argument, wenn das Objekt erstellt wird. Deshalb hast du diese Nachricht erhalten. Der Typparameter kann aus der Optionsvariable abgerufen werden, die in der Methode buildForm verfügbar ist.

Hier ist ein Beispiel Ihrer Formularklasse:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $myType = $options['type']; 
    if ($myType == NULL){ 
     // TODO: 
    } 
} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Banner\BannerBundle\Entity\Banner', 
     'type' => null, 
    )); 
} 
0

Die Antwort auf Ihre Frage war bereits auf Stackoverflow. Sie können es lesen here .Ich denke, Sie müssen __construct Funktion entfernen, denn von Symfony 2.8 müssen Sie eine Zeichenfolge übergeben zu createForm-Methode, nicht die Instanz des Objekts und diese Zeichenfolge wird wahrscheinlich später als Konstruktor ohne Parameter behandelt. Dann sollte es funktionieren :)

0

Wenn Sie einige Argumente in FormType ‚s contructor übergeben wollen und zu können, um es über createForm instanziiert, müssen Sie es als Service mit einem richtigen form.type Tag wie folgt registrieren:

# src/AppBundle/Resources/config/services.yml 
services: 
    app.form.type.banner: 
     class: AppBundle\Form\Type\BannerType 
     arguments: 
      - '%type%' 
     tags: 
      - { name: form.type } 

Aber das können Sie nur Argumente übergeben, die in Service-Container zur Verfügung, die andere Dienste, Parameter usw.

Was Sie Sinn machen wollen macht eigentlich nicht. Sie können nicht erwarten, dass Sie einen Parameter im Konstruktor in der Klasse FormType erhalten, aber übergeben Sie ihn über das dritte Argument createForm(), das Optionen und keine Konstruktorargumente enthalten soll. Es sieht so aus, als würden Sie das falsch machen, aber ich müsste mehr Code haben und wissen, was Sie tun wollen, um Ihnen zu sagen, wie es gemacht werden soll.

Verwandte Themen