Symfony2でフォームを作成しています。フォームbook
には、ユーザーがBooks
エンティティのリストから選択できるフィールドが1つだけ含まれています。選択したものがコントローラーにBook
あるものに属しているかどうかを確認する必要があります。Author
public class MyFormType extends AbstractType
{
protected $author;
public function __construct(Author $author) {
$this->author = $author;
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('book', 'entity', array('class' => 'AcmeDemoBundle:Book', 'field' => 'title');
}
// ...
}
フォームを送信した後、選択したものがコントローラーにBook
書き込まれていることを確認したいと思います。$author
public class MyController
{
public function doStuffAction() {
$author = ...;
$form = $this->createForm(new MyFormType($author));
$form->bind($this->getRequest());
// ...
}
}
残念ながら、私はそれを行う方法を見つけることができません。The Cookbookで説明されているように、カスタムバリデーター制約を作成しようとしましたがEntityManager
、バリデーターをサービスとして定義することでasパラメーターを渡すことはできます$author
が、コントローラーからバリデーター制約に渡すことはできません。
class HasValidAuthorConstraintValidator extends ConstraintValidator
{
private $entityManager;
public function __construct(EntityManager $entityManager) {
$this->entityManager = $entityManager;
}
public function validate($value, Constraint $constraint) {
$book = $this->entityManager->getRepository('book')->findOneById($value);
$author = ...; // That's the data I'm missing
if(!$book->belongsTo($author))
{
$this->context->addViolation(...);
}
}
}
このソリューションは、まさに私が探していたものである可能性がありますが、私のフォームはエンティティにバインドされておらず、意図されていません(getData()
メソッドからデータを取得しています)。
私の問題の解決策はありますか?これはよくあることですが、どうすれば解決できるのか本当にわかりません。