26 окт 2020

Автогенерация WSDL

#php, #xml, #soap, #wsdl

Soap-сервисы часто работают в режиме wsdl на основе соответствующего документа. Это удобно, ведь описание всех возможностей api хранится в одном файле wsdl, ссылку на который можно отправлять всем желающим пользоваться нашим сервисом. Этот документ имеет довольно сложную структуру, поэтому разработчики часто генерируют его он-лайн и очень редко пишут руками. Я же хочу предложить вам способ генерации wsdl-файла динамически и на лету.

Автогенерация WSDL

WSDL - Web Services Description Language это сердце нашего SOAP-сервиса. С помощью него клиенты получают информацию об адресе сервиса, доступным методам и типам данных, которые нужно передавать. Это значит, что при добавлении нового функционала, его обязательно нужно описывать в этом файле. И тут возникает масса проблем, например, разработчик может запросто забыть обновить wsdl или даже сделать ошибку при редактировании этого документа. В этом случае бизнес рискует потерять много клиентов, а программист показать свой непрофессионализм и может даже быть уволен.

Автогенерация wsdl на лету позволит избежать всех вышеописанных проблем и сделает поддержку SOAP-сервиса значительно удобней. Мой выдуманный сервис будет называться Calculator и будет предоставлять пользователям два метода: sum и prod. Вот как может выглядеть этот класс:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php

class Calculator
{
    /**
     * @soap
     * @param float $a
     * @param float $b
     * @return float
     */
    public function sum($a, $b)
    {
        return $a+$b;
    }

    /**
     * @soap
     * @param float $a
     * @param float $b
     * @return float
     */
    public function prod($a, $b)
    {
        return $a*$b;
    }
}

Обратите внимание на комментарии, именно они позволят нам использовать функционал автогенерации, и самое главное: в wsdl-файле будут отображены лишь те методы, которые отмечены @soap.

Для создания wsdl-документа на лету мы будем использовать библиотеку php2wsdl. Её удобно можно установить через консоль и composer.

composer require php2wsdl/php2wsdl

Осталось создать файл calculator_wsdl.php, в который необходимо поместить следующий код:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php
// подключаем автолодер composer
include "vendor/autoload.php";
// отдаем тип xml
header('Content-Type: text/xml');
// наш класс-сервис
$class = "Calculator";
// адрес сервиса
$serviceURI = "http://localhost/calculator.php";
// создание объекта генератора
$wsdlGenerator = new PHP2WSDL\PHPClass2WSDL($class, $serviceURI);
// парсинг с использованием комментариев
$wsdlGenerator->generateWSDL(true);
// выводим результат
echo $wsdlGenerator->dump();

Теперь вы можете делиться с клиентами сервиса ссылкой на новый файл и никогда не беспокоиться об его актуальности, ведь теперь он генерируется автоматически. А если хотите прокачать свои знания сервисов, то записывайтесь на курс PHP-Создание сервисов.

Все статьи

© 2020-2021 Александр Пантелеев