我有带有字段“ url”的消息实体。和MessageType形式。用户可以在“ url”中键入不同的url,但是只有主机会保留在数据库中。我需要使用Symfony2 Form Event。所以我尝试在下一个代码中实现它:
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);
}
);
}
}
我得到以下通知:
“注意:数组到字符串的转换”
这是什么意思?
我的消息实体具有方法__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-casperjs获取内部文本 - php我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…
PHP getallheaders替代 - php我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…
PHP:将字符串拆分为字母和数字部分的最佳方法 - php我有几个格式的字符串AA11 AAAAAA1111111 AA1111111 分离字符串的字母和数字部分的最佳方法(最有效)? 参考方案 如果它们都是一系列字母,然后是一系列数字,并且没有非字母数字字符,那么sscanf()可能比regexp更有效$example = 'AAA11111'; list($alpha,$numeric) =…
php:是否有充分的理由引用所有数组键/索引? - php我正在遍历别人的代码,他们总是避免转义其数组键。例如:$ row_rsCatalogsItems [名称]代替$ row_rsCatalogsItems ['名称']因此,我不断地对自己接触的所有事物进行微小的更改,以应对这些惰性。但是现在我想知道这样做是否有很多好处。我得到它会在默认为字符串之前检查常量(我在处理常量时会讨厌php中的行为,因为即使未定义,…
PHP:从函数返回值并直接回显它? - php这可能是一个愚蠢的问题,但是……的PHPfunction get_info() { $something = "test"; return $something; } html<div class="test"><?php echo get_info(); ?></div> 有没有办…