gpt4 book ai didi

php - 提交后更改表单字段的数据

转载 作者:行者123 更新时间:2023-12-03 23:03:16 24 4
gpt4 key购买 nike

我有带有字段“url”的消息实体。和 MessageType 形式。用户可以在“url”中键入不同的 url,但只有主机会保存到数据库中。我需要使用 Symfony2 表单事件。所以我尝试在下一个代码中实现它:

class MessageType extends AbstractType
{

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('url');

$builder->addEventListener(
FormEvents::SUBMIT,
function(FormEvent $event) {
$form = $event->getForm();

$data = $event->getData();
$url = $data->getUrl();
$form->setData(parse_url($url), PHP_URL_HOST);
}
);
}
}

我收到以下通知:

"Notice: Array to string conversion"

这是什么意思?

我的 Message 实体有方法 __toString():

public function __toString()
{
return $this->getUrl();
}

谢谢

最佳答案

您可以尝试使用 Data Transformer这是为此目的而设计的。例如:

namespace Vendor\MyBundle\Form\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;

class HostFromUrlTransformer implements DataTransformerInterface
{
public function transform($host)
{
return ($host === null) ? "" : $host;
}

public function reverseTransform($url)
{
return parse_url($url, PHP_URL_HOST);
}
}

然后以形式实现:

use Vendor\MyBundle\Form\DataTransformer\HostFromUrlTransformer;

class MessageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(
$builder->create('url')
->addModelTransformer(new HostFromUrlTransformer())
);
}
}

但是,这种方法肯定有其缺点。您将无法在实体上添加 Assert\URL,因为验证发生在转换之后,并且仅拥有主机部分将不再有效。您可以通过将 Symfony 验证器传递给您的数据转换器来解决此问题,然后针对 Assert\Url 验证 $url 类似于此处的方法:Combine constraints and data transformers ,但这也让人觉得有点老套。

一个比所有这些更简单的解决方案就是将实体中的 setUrl($url) 方法更新为如下所示:

public function setUrl($url)
{
$host = parse_url($url, PHP_URL_HOST);
$this->url = $host ?: $url;
}

因此,在这种情况下,如果您传入一个 URL,它只保存为 $host,如果您使用 setUrl() 并且它已经转换,它只会保留已经存在的值。

更好的是,您可以简单地保存他们发送给您的完整 URL,这将允许您维护 @Assert\URL 验证,然后添加以下两个函数:

public function getHost()
{
return parse_url($this->url, PHP_URL_HOST);
}

public function __toString()
{
return $this->getHost();
}

以上允许您保留所有已保存的数据,并将解析 URL 的工作更改为由您的应用程序完成,而不是尝试在数据库层解析出来。 __toString() 方法将始终返回主机,如果需要,您仍然可以访问传入的完整 URL。您甚至可以去掉上面的 getHost() 函数。

如果你想使用 FormEvent,你就在正确的轨道上,但代码有点偏离。参见 http://symfony.com/doc/current/components/form/form_events.html#b-the-formevents-submit-event了解更多详情。

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event)
{
$data = $event->getData();
$data['url'] = parse_url($data['url'], PHP_URL_HOST);

$event->setData($data);

// this one-liner might also work in place of the 3 lines above
$event->setData('url', parse_url($event->getData('url'), PHP_URL_HOST));
});

关于php - 提交后更改表单字段的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27574075/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com