2013-07-05 3 views
1

Я пытаюсь использовать библиотеку CentralNic PHP EPP для взаимодействия с Nominet EPP.Центральная библиотека PHP EPP - логин

Это ясно, как genrate командных кадров, используя Net_EPP_Frame_Command класса Например,

$frame = new Net_EPP_Frame_Command("check", "host"); 
$frame->addObjectProperty("name", "ns1.example.com"); 
$frame->addObjectProperty("name", "ns2.example.com"); 
$frame->addObjectProperty("name", "ns3.example.com"); 
$client->sendFrame($frame->saveXML()); 

В результате

<?xml version="1.0"?> 
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0"> 
<command> 
<check> 
<host:check xmlns:host="urn:ietf:params:xml:ns:host-1.0"> 
<host:name>ns1.example.com</host:name> 
<host:name>ns2.example.com</host:name> 
<host:name>ns3.example.com</host:name> 
</host:check> 
</check> 
<clTRID>ABC-12345</clTRID> 
</command> 
</epp> 

Каких именно то, что мне нужно. Единственная проблема заключается в том, что я не в состоянии генерировать логин кадр, который должен выглядеть подобно

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
    <epp xmlns="urn:ietf:params:xml:ns:epp-1.0"> 
    <command> 
     <login> 
     <clID>ClientX</clID> 
     <pw>foo-BAR2</pw> 
     <newPW>bar-FOO2</newPW> 
     <options> 
      <version>1.0</version> 
      <lang>en</lang> 
     </options> 
     <svcs> 
      <objURI>urn:ietf:params:xml:ns:obj1</objURI> 
      <objURI>urn:ietf:params:xml:ns:obj2</objURI> 
      <objURI>urn:ietf:params:xml:ns:obj3</objURI> 
      <svcExtension> 
      <extURI>http://custom/obj1ext-1.0</extURI> 
      </svcExtension> 
     </svcs> 
     </login> 
     <clTRID>ABC-12345</clTRID> 
    </command> 
</epp> 

Не могли бы вы направить меня в правильном направлении?

Спасибо


Я отредактировал https://github.com/centralnic/php-epp/blob/master/Net/EPP/Frame/Command.php Добавляя еще две функции класса

 function setParam($param, $value) 
     { 
      $this->$param->appendChild($this->createTextNode($value)); 
      //$this->$param->setAttribute($param, $value); 
     } 

     function addElement($name, $value, $parentNode) 
     { 
      $element = $this->createElement($name); 
      $element->appendChild($this->createTextNode($value)); 
      $this->$parentNode->appendChild($element); 
     } 

То, как я использую сейчас:

public function login($clid, $pw) 
    { 
     $frame = $this->buildLoginFrame($clid, $pw); 
     $this->client->sendFrame($frame->saveXML()); 
     print_r($frame->friendly()); 
     print_r($this->client->getFrame()); 
    } 

    private function buildLoginFrame($clid, $pw) 
    { 
     $frame = new Net_EPP_Frame_Command_Login(); 
     $frame->setParam("clID", $clid); 
     $frame->setParam("pw", $pw); 
     $frame->setParam("eppVersion", self::VERSION); 
     $frame->setParam("eppLang", self::LANG); 
     $frame->addElement("objURI", "urn:ietf:params:xml:ns:contact-1.0", "svcs"); 
     $frame->addElement("objURI", "urn:ietf:params:xml:ns:domain-1.0", "svcs"); 
     $frame->addElement("objURI", "urn:ietf:params:xml:ns:host-1.0", "svcs"); 
     $frame->setParam("clTRID", $this->clTRID); 
     return $frame; 
    } 

Окончательный вариант, который кажется лучшим в нынешней ситуации

class EPPHelper 
    { 
     static function setParam($frame, $param, $value) 
     { 
      $frame->$param->appendChild($frame->createTextNode($value)); 
     } 

     public function addElement($frame, $name, $value, $parentNode) 
     { 
      $element = $frame->createElement($name); 
      $element->appendChild($frame->createTextNode($value)); 
      $parentNode->appendChild($element); 
     } 
    } 
} 

... 

public function login($clid, $pw) 
{ 
    $frame = $this->buildLoginFrame($clid, $pw); 
    $this->client->sendFrame($frame->saveXML()); 
    print_r($frame->friendly()); 
    print_r($this->client->getFrame()); 
} 

private function buildLoginFrame($clid, $pw) 
{ 
    $frame = new Net_EPP_Frame_Command_Login(); 
    //$frame->setParam("clID", $clid); 
    EPPHelper::setParam($frame, "clID", $clid); 
    EPPHelper::setParam($frame, "pw", $pw); 

    EPPHelper::setParam($frame, "eppVersion", self::VERSION); 
    EPPHelper::setParam($frame, "eppLang", self::LANG); 
    EPPHelper::addElement($frame, "objURI", "urn:ietf:params:xml:ns:contact-1.0", $frame->svcs); 
    EPPHelper::addElement($frame, "objURI", "urn:ietf:params:xml:ns:domain-1.0", $frame->svcs); 
    EPPHelper::addElement($frame, "objURI", "urn:ietf:params:xml:ns:host-1.0", $frame->svcs); 
    EPPHelper::setParam($frame, "clTRID", $this->clTRID); 

    return $frame; 
} 
+0

Что содержит документация этой библиотеки о логине? Кажется, для него есть специальный класс: https://github.com/centralnic/php-epp/blob/master/Net/EPP/Frame/Command/Login.php – hakre

+0

Я боюсь, что в сети нет документации бы то ни было. Мне пришлось изменить файл Login.php в соответствии с моими потребностями, а также удалить debug_log в строке # 32 в Command.php. Кажется, что сам проект действительно сырой и требует много исправления. Мне удалось создать фрейм, но я не уверен, что так оно и должно было быть сделано. Если кому-то интересно, я могу опубликовать обходной путь –

+0

Вам не нужно. Он работает так же, как и класс, описанный выше. Поскольку 'svcs' является DOMElement, вы можете просто добавить дочерние узлы к вашим потребностям, даже если эти более сложные свойства выглядят. Возможно, вы захотите добавить код, в который вы редактировали свой вопрос (разделите его на строку), должно быть легко дать несколько лучших предложений о том, как это используется. См. Также: http://php.net/book.dom - это базовая библиотека CentralNic PHP EPP построена поверх. – hakre

ответ

1

именно по этой причине я создал новую библиотеку: https://github.com/AfriCC/php-epp2 - это началось как расширение/вилки Net_EPP, но в конечном итоге обмена, может быть только 1% от код Net_EPP.

В основном это «высокоуровневый» клиент EPP для PHP. Высокий уровень означает, что вам не нужно беспокоиться о создании объектов/XML, но вы можете просто использовать удобные методы для изменения ваших фреймов.

<?php 
require 'src/AfriCC/autoload.php'; 

use AfriCC\EPP\Frame\Command\Create\Host as CreateHost; 

$frame = new CreateHost; 
$frame->setHost('ns1.example.com'); 
$frame->addAddr('8.8.8.8'); 
$frame->addAddr('8.8.4.4'); 
$frame->addAddr('2a00:1450:4009:809::1001'); 
echo $frame; 

Кроме того, если вы используете клиент, он будет автоматически делать входа/выхода для вашего:

<?php 
require 'src/AfriCC/autoload.php'; 

use AfriCC\EPP\Client as EPPClient; 

$epp_client = new EPPClient([ 
    'host' => 'epptest.org', 
    'username' => 'foo', 
    'password' => 'bar', 
    'services' => [ 
     'urn:ietf:params:xml:ns:domain-1.0', 
     'urn:ietf:params:xml:ns:contact-1.0' 
    ], 
    'debug' => true, 
]); 

try { 
    $greeting = $epp_client->connect(); 
} catch(Exception $e) { 
    echo $e->getMessage() . PHP_EOL; 
    unset($epp_client); 
    exit(1); 
} 

$epp_client->close(); 

Это все еще довольно новое, так что могут быть некоторые ошибки. Его openource, так что не надо с ним обходиться и просто записывать отчет об ошибке или делать запрос на слияние.

 Смежные вопросы

  • Нет связанных вопросов^_^