Zend 2 Hostname Validator для IDN доменов

Я могу зарегистрироваться töst.tv в качестве домена, другими словами, это действительное имя домена.

Zend 2 Hostname Validator вернет false в следующем примере:

// create hostname validator
$oHostnameValidator = new \Zend\Validator\Hostname(array(
'allow' => \Zend\Validator\Hostname::ALLOW_DNS,
'useIdnCheck' => true,
'useTldCheck' => false,
));

if(!$oHostnameValidator->isValid('töst.tv')) // isValid returns false
{
print_r($oHostnameValidator->getMessages());
}

getMessages вернусь:

Array
(
[hostnameInvalidHostnameSchema] => Die Eingabe scheint ein DNS Hostname zu sein, passt aber ...
[hostnameInvalidLocalName] => Die Eingabe scheint kein gültiger lokaler Netzerkname zu...
)

я вижу это protected $validIdns не включает в себя tv (в классе Zend\Validator\Hostname)

Есть ли способ (безопасный для обновления) внедрить текущие действительные проверки idn в некоторые tlds в валидаторе имени хоста zend?

Или это ошибка, о которой следует сообщить?

редактировать

я только что расширил валидатор имени хоста (спасибо Уилт)

<?php

namespace yourNamespace;

class Hostname extends \Zend\Validator\Hostname
{
/**
* Sets validator options.
*
* @param int  $allow       OPTIONAL Set what types of hostname to allow (default ALLOW_DNS)
* @param bool $useIdnCheck OPTIONAL Set whether IDN domains are validated (default true)
* @param bool $useTldCheck Set whether the TLD element of a hostname is validated (default true)
* @param Ip   $ipValidator OPTIONAL
* @see http://www.iana.org/cctld/specifications-policies-cctlds-01apr02.htm  Technical Specifications for ccTLDs
*/
public function __construct($options = array())
{
// call parent construct
parent::__construct($options);

// inject valid idns
$this->_injectValidIDNs();
}

/**
* inject new valid idns - use first DE validation as default (until we get the specified correct ones ...)
*/
protected function _injectValidIDNs()
{
// inject TV validation
if(!isset($this->validIdns['TV']))
{
$this->validIdns['TV'] = array(
1 => array_values($this->validIdns['DE'])[0],
);
}
}
}

1

Решение

Вы можете создать проблему на GitHub и сделать запрос на получение Zend\Validator\Hostname класс, в котором вы добавляете значение, которое в соответствии с вами должно быть также внутри $validIdns массив.

В противном случае вы также можете расширить существующий класс в своем проекте и перезаписать существующий $validIdns значение с вашим собственным:

<?php

namespace My\Validator;

class HostName extends \Zend\Validator\Hostname
{
protected $validIdns = [
//...your custom value for TV + existing ones...
]
}

Теперь вы можете использовать это так:

$oHostnameValidator = new \My\Validator\Hostname(array(
'allow' => \My\Validator\Hostname::ALLOW_DNS,
'useIdnCheck' => true,
'useTldCheck' => false,
));
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]