2016-04-06 19 views
0
Symfony2'de

I de olduğu gibi string yöntem createForm geçmesi gereken symfony3 olarakSymfony3 setAction FormType

// MyController.php 
$formType = new MyFormType($this->container); 
$form = $this->createForm($formType); 

// MyFormType.php 
protected $container; 

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

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->setAction($this 
      ->container 
      ->get('router') 
      ->generate('myAction') 
     ); 
    // ... 
    } 
} 

dönmesini mümkün, bu yüzden güvenilir

MyFormType için kontrolör veya yönlendirici geçmek mümkün değil FormType'ı bir hizmet olarak tanımlamak, ancak davranışı değiştirmez.

MyFormType'da eylemi nasıl ayarlayabilirim (MyController'da değil)?

// MyController.php 
$this->createForm(MyFormType::class, null, ['router' => $this->get('router')]); 

// MyFormType.php 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->setAction($options['router']->generate('myAction')); 
    // ... 
} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'router' => null, 
     // ... 
    ]); 
} 

Ama bu çözüm benim için biraz çirkin görünüyor:

+0

Form türünü nasıl bir hizmet olarak tanımladığınızı gösterin. Yönelticiyi sorun olmadan enjekte edebilmelisiniz. – Cerad

+0

Evet, yönlendiriciyi sorun çıkarmadan enjekte ettim, ama bana öyle geliyor ki bu symfony, 'new FormType' biçiminde form hizmeti yaratıyor ('createForm' yöntemini kullanırken). Bu yüzden FormType'daki kurucum, herhangi bir paramız olmadan çağrılır. – Eddie

+0

Hayır. Form türünüzü bir hizmet olarak uygun şekilde tanımladıysanız, createForm işlevi onu kapsayıcıdan çeker. Çalışmanızı dikkatlice kontrol edin. Hizmet tanımlarınızın kapsayıcı: debug kullanılarak yüklendiğinden emin olun. Çalışacağına söz veriyorum. – Cerad

cevap

1

birinci ve şu anda bulunan tek seçenektir. $this->createForm(MyFormType::class); En azından Symfony2'deki (2.7'de test)

0

Sen mesela hizmet olarak form tanımlamak gerekir :

//MyController.php 
$this->createForm(MyFormType::class, null, array('action' => $this->generateUrl('my_acton_name'))); 

Bu çözüm ile FormType'ınızı değiştirmeye gerek yoktur. Symfony Forms tarafından desteklenen gerçek bir seçenektir, bu yüzden yönlendiriciyi kullanarak eklemeniz gerekmez. here belgelerini bulabilirsiniz.

+0

Tam olarak yazdıklarını denedim, çok fazla kod olduğu için burada tüm sınıfları yayınlamayacağım. Symfony2'de (bir süre önce) FormTypes'i (services.yml) tanımlamak için bu yolu kullandım ve işe yaradı, ama sf3'te MyFormType yapıcısında hiçbir şeyim olmadı :( – Eddie

1

, bunu yapabilirsiniz Kumandanızda olarak

# app/config/services.yml 
services: 
    app.form.type.my_form_type: 
     class: AppBundle\Form\Type\MyFormType 
     arguments: [ "@router" ] 
     tags: 
      - { name: form.type } 

// src/AppBundle/Form/Type/MyFormType.php 
namespace AppBundle\Form\Type; 

use Symfony\Bundle\FrameworkBundle\Routing\Router; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 

class MyFormType extends AbstractType 
{ 
    private $router; 

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

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // You can now use myService. 
     $builder 
      ->setAction(
       $this->router->generate('myAction') 
      ) 
      ->add('myInput') 
      ->add('save', SubmitType::class) 
     ; 
    } 
} 
o zaman sadece çağrı:

+0

Neredeyse cevabımdakiyle aynı. Farkı geçtim yönlendirici, url değil.Url'yi denetleyicide saklamak istemiyorum, bu iyi bir uygulama değil. – Eddie

+0

Aslında bu sizinkiyle neredeyse aynı, fark yerleşik bir işlevsellik kullanıyorum. İkisi de mümkün. – AnthonyB

İlgili konular