<?php
namespace Juki\Bundle\AppBundle\EventListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
/**
* Adds a protocol to a URL if it doesn't already have one.
*
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class FixUrlProtocolListener implements EventSubscriberInterface
{
private $defaultProtocol;
private $defaultHost;
/**
* @param string|null $defaultProtocol The URL scheme to add when there is none or null to not modify the data
*/
public function __construct(?string $defaultProtocol = 'http', $defaultHost = '')
{
$this->defaultProtocol = $defaultProtocol;
$this->defaultHost = $defaultHost;
}
public function onSubmit(FormEvent $event)
{
$data = $event->getData();
if (is_string($data)) {
$valid = preg_match('%^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu',
$data, $result);
if (!$valid) {
if (strpos('/', substr($data, 0, 1)) === false) {
$data = "/" . $data;
}
$data = $this->defaultProtocol . '://' . $_SERVER['FRONT_HOST'] . $data;
}
$event->setData($data);
}
// if ($this->defaultProtocol && $data && \is_string($data) && !preg_match('~^[\w+.-]+://~', $data)) {
// $event->setData($this->defaultProtocol . '://' . $this->defaultHost . $data);
// }
}
public static function getSubscribedEvents()
{
return [FormEvents::SUBMIT => 'onSubmit'];
}
}