Php Symfony2在bind()之后和检查isValid()之前插入表单值
我希望fbid和game_id的组合是唯一的。 我想用form->isValid()方法测试它。但我不想通过隐藏输入传递这些值 我的实体代码:Php Symfony2在bind()之后和检查isValid()之前插入表单值,php,symfony,Php,Symfony,我希望fbid和game_id的组合是唯一的。 我想用form->isValid()方法测试它。但我不想通过隐藏输入传递这些值 我的实体代码: /** * @ORM\Entity * @ORM\Table(name="Member", * uniqueConstraints={ * @ORM\UniqueConstraint(columns={"fbid", "game_id"}) * }) * @UniqueEntity(fields={"
/**
* @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()) {
但我有一个问题:
不能更改绑定表单的数据
该错误告诉您,如果在绑定后更改了表单数据,则无法使用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()) {
该错误告诉您,如果在绑定后更改了表单数据,则无法使用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()) {
创建服务并收听
FormEvents::POST_BIND
事件。在onPostBind()
中,您可以获取要检查的值,并在必要时添加错误:
class AddGameValidation实现EventSubscriberInterface
{
/**
*{@inheritardoc}
*/
公共静态函数getSubscribedEvents()
{
返回数组(
FormEvents::POST_BIND=>“onPostBind”,
);
}
/**
*@param\Symfony\Component\Form\Event\DataEvent$Event
*/
公共函数onPostBind(DataEvent$event)
{
$form=$event->getForm();
//获取数据
if(false==$condition){
$form->addError(新FormError('somemessage'));
}
}
}
提供服务并收听FormEvents::POST_BIND
事件。在onPostBind()
中,您可以获取要检查的值,并在必要时添加错误:
class AddGameValidation实现EventSubscriberInterface
{
/**
*{@inheritardoc}
*/
公共静态函数getSubscribedEvents()
{
返回数组(
FormEvents::POST_BIND=>“onPostBind”,
);
}
/**
*@param\Symfony\Component\Form\Event\DataEvent$Event
*/
公共函数onPostBind(DataEvent$event)
{
$form=$event->getForm();
//获取数据
if(false==$condition){
$form->addError(新FormError('somemessage'));
}
}
}
Gremo的解决方案很好,但创建全局服务并侦听所有POST\u绑定事件来处理一个表单POST\u绑定并不是一个好主意。仅在创建指定表单时设置此钩子要便宜得多
下面是我的建议Gremo的解决方案是一个好的解决方案,但创建全局服务并监听所有POST\u BIND事件来处理一个表单POST\u BIND并不是一个好主意。仅在创建指定表单时设置此钩子要便宜得多
以下是我的建议您也可以在表单中使用事件订阅者,并收听FormEvents::POST_BIND事件。 有关使用事件订阅服务器的详细信息:
还有一个类似的stackoverflow问题:您还可以在表单中使用事件订阅者,并收听FormEvents::POST_BIND事件。 有关使用事件订阅服务器的详细信息:
还有一个类似的stackoverflow问题:当我这样做时,isValid()返回true,但我有一个“完整性约束冲突”(游戏值不在我的表单中),所以在检查表单后验证实体本身。我要编辑答案…fbid来自我的表单和游戏值我不明白,这就是为什么你必须验证实体本身。奇怪的是,
$validator->validate($member)
返回的值太大,无法对其进行计数或显示。当我这样做时,isValid()返回true,但我有一个“完整性约束冲突”(游戏值不在我的表单中)所以在检查表单后验证实体本身。我将编辑答案…fbid来自我的表单和游戏值。我不明白,这就是为什么你必须验证实体本身。奇怪的是,$validator->validate($member)返回的值
太大,无法对其进行计数或显示。$data->setSomeAdditionalField('setSomeAdditionalField');
我找不到关于setSomeAdditionalField的文档?!以及如何将动态值传递给setSomeAdditionalField哦,它只是用来显示您可以使用实体并设置它的某些字段($data->setGame,$data->setFbid…)抱歉!以及如何传递动态值“setSomeAdditionalField”您希望绑定到哪种类型的值?$data->setSomeAdditionalField('setSomeAdditionalField'))
我找不到关于setSomeAdditionalField的文档?!以及如何将动态值传递给setSomeAdditionalField噢,它只是用来表示您可以使用实体并设置它的某些字段($data->setGame,$data->setFbid…)对不起!以及如何传递动态值“setSomeAdditionalField”您想绑定到哪种值?