我希望fbid和game_id的组合是唯一的。 我想用form-> isValid()方法测试它。但我不想通过隐藏输入传递这个值。
我的实体代码:
/**
* @ORM\Entity
* @ORM\Table(name="Member",
* uniqueConstraints={
* @ORM\UniqueConstraint(columns={"fbid", "game_id"})
* })
* @UniqueEntity(fields={"fbid","game"})
*/
class Member
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Game", inversedBy="members")
* @ORM\JoinColumn(name="game_id", referencedColumnName="id")
*/
protected $game;
/**
* @ORM\Column(type="string")
*/
private $fbid;
我试试:
if ($request->getMethod() == 'POST') {
$form->bind($request);
$member = $form->getData();
$member->setGame( $this->game );
$form->setData($member);
if ($form->isValid()) {
但我有这个问题:
您无法更改绑定表单的数据
答案 0 :(得分:3)
Gremo 的解决方案很好,但创建全局服务并监听所有POST_BIND事件只是为了处理一个表单POST_BIND并不是一个好主意。仅在创建指定表单时设置此挂钩要便宜得多。
答案 1 :(得分:1)
如果您在绑定后更改了表单数据,则该错误告诉您无法使用isValid()检查表单有效性。
为什么需要在绑定和有效性检查之间设置游戏?
您应该在绑定请求之前设置关联游戏,如下所示:
//For creation, you have to initialize a new object
$member = new Member();
$member->setGame( $this->game );
$form = $this->createForm(new FormType(), $member)->getForm();
if ($request->getMethod() == 'POST') {
$validator = $this->get('validator');
$errors = $validator->validate($member);
if (count($errors) > 0) {
return new Response(print_r($errors, true));
} else {
// persist entity ...
}
$form->bind($request);
if ($form->isValid()) {
答案 2 :(得分:0)
提供服务并聆听FormEvents::POST_BIND
事件。在onPostBind()
中,您可以获取要检查的值,并在必要时添加错误:
class AddGameValidation implements EventSubscriberInterface
{
/**
* {@inheritDoc}
*/
public static function getSubscribedEvents()
{
return array(
FormEvents::POST_BIND => 'onPostBind',
);
}
/**
* @param \Symfony\Component\Form\Event\DataEvent $event
*/
public function onPostBind(DataEvent $event)
{
$form = $event->getForm();
// Get the data
if(false === $condition) {
$form->addError(new FormError('Some message'));
}
}
}
答案 3 :(得分:0)
您也可以在表单中使用事件订阅者,也许可以收听FormEvents :: POST_BIND事件。 有关使用事件订阅者的更多信息:http://symfony.com/doc/2.0/cookbook/form/dynamic_form_generation.html
类似的stackoverflow问题:Which is the suggested place to modify binded form data in Symfony?