これが 2 か月後の役に立てば幸いです :) これを行う最善の方法は、EventSubscriberInterface を実装するクラスをフォーム オブジェクトの pre-bind イベントにバインドすることです。このメソッドを使用すると、admin ジェネレーターのコントローラーを編集する必要はありません。
サブスクライバー リスナー Ignore Empty fields、リンクはスペイン語ですが、翻訳できます。基本的には、EventSubscriberInterface インターフェイスを実装するクラスを作成します。ブログ投稿でクラスが提供されます。
namespace Acme\TestBundle\Admin;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class IgnoreBlankFieldListener implements EventSubscriberInterface
{
private $factory;
private $name;
public function __construct(FormFactoryInterface $factory, $name)
{
$this->factory = $factory;
$this->name = $name;
}
public static function isNotEmpty($var )
{
if(is_array($var))
{
$notempty = false;
foreach( $var as $v )
{
$notempty = $notempty || !IgnoreBlankFieldListener::isNotEmpty($v);
}
return $notempty;
}
else
return !empty ($var);
}
public static function isEmpty( $var )
{
return IgnoreBlankFieldListener::isNotEmpty($var);
}
public function preBind(FormEvent $event){
$data = $event->getData();
$data_name = $data[$this->name];
if( IgnoreBlankFieldListener::isEmpty($data_name) )
{
$form = $event->getForm();
unset( $data[$this->name] );
$event->setData($data);
$form->remove($this->name);
}
}
public static function getSubscribedEvents() {
return array(FormEvents::PRE_BIND => 'preBind');
}
}
次に、このクラスをフォームにサブスクライブします。ClassType 定義の buildForm 部分でこれを行います。
public function buildForm(FormBuilder $builder, array $options)
{
//initial code
//
$subscriber = new IgnoreBlankFieldListener($builder->getFormFactory(), 'password');
$builder->addEventSubscriber($subscriber);
}
Symfony ドキュメントの詳細