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

我有带有字段“ 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> 有没有办…