Автоматическая генерация запросов к серверу на основе XSD схемы

FB3

Новичок
Автоматическая генерация запросов к серверу на основе XSD схемы

Имеются XSD схемы, связанные между собой инклудами. То есть в основном файле подключаются все остальные.
Есть в них запросы типа:
PHP:
<xs:complexType name="UserGetRequest">
  <xs:annotation>
    <xs:documentation>
      Request to get the user information.  The response is either UserGetResponse
      or ErrorResponse.
    </xs:documentation>
  </xs:annotation>
  <xs:complexContent>
    <xs:extension base="request">
      <xs:sequence>
        <xs:element name="userId" type="UserId"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
Сейчас есть скрипт, который генерит класс на основе такого кода (копипастом в скрипт вставляется) из XSD + XML для него + все это делается регулярными выражениями :(. Когда классу передаем параметры, то он подгружает XML и с помощью DOM вставляет туда нужны параметры.
Хотелось бы просто положить этот набор запросов в какую-нибудь папку проекта и писать в коде PHP что-нибудь типа:
$client->UserGetRequest($userId), а $client сам бы искал нужный запрос в XSD, генерил XML необходимый и отправлял бы его на сервер.
Подскажите плиз идею, как это можно реализовать.
Понимаю, что начинать нужно с волшебных методов __call(), наверняка смогу написать в коде нахождение запроса в XSD схеме, но что с ним делать дальше (без регулярок, по нормальному, все таки это XML), пока не придумал, поэтому и прошу совета.
И в догонку, насколько я понимаю, __call() да и вообще методы в PHP не могут знать названия переменных, которые им передали, соответственно, придется передавать ассоциативный массив, то есть вместо $client->UserGetRequest($userId) писать $client->UserGetRequest(array('userId' => $userId)). Верно?
 

kirill538

Новичок
методы в PHP не могут знать названия переменных, которые им передали
Могут. Смотрите в сторону Reflection.

Только не переменных, а параметров, разумеется. Очень непонятное изложение задачи ... Вы пытаетесь собственную реализацию SOAP сделать, что ли ?
 

FB3

Новичок
Нет, генерится XML с помощью DOM и потом отправляется строкой по SOAP вот так:
PHP:
class SomeSoapClient extends SoapClient
{
    public function someMethod()
    {
        $request = .... // генерим XML
        $response = $this->processMessage(array("in" => $request));
        // обрабатываем $response
    }
}
Это сейчас так работает примерно.
Но так как заранее известно, что запросы могут отправляться не только по SOAP, унаследовать от SoapClient данный класс генерации запросов не получится.
Наоборот в классе нужно будет предусмотреть возможность выбора транспорта запросов (SoapClient в данном случае) для пересылки запроса.
Но в принципе, общая идея чем-то похожа на SoapClient.
 

kirill538

Новичок
Ну так и сделайте по аналогии с реализацией soap на php. Ни при чем тут рефлексия и вообще php. у вас же запрос не в php код сериализуется. XSD можно использовать для валидации запроса стандартными средствами xml.
 

FB3

Новичок
сделайте по аналогии с реализацией soap на php
В смысле брать код на C++ и смотреть, что там понаписано?
Или мы про интерфейс класса, в данном случае, говорим?
 

kirill538

Новичок
реализация soap есть не только на с. на pure php тоже есть - например nusoap.
 
Сверху