登录  /  注册
首页 > php框架 > Laravel > 正文

laravel框架下soapServer支持wsdl的代码示例

不言
发布: 2018-10-26 16:33:33
转载
5446人浏览过

本篇文章给大家带来的内容是关于laravel中soapserver支持wsdl的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

$server = new \SoapServer(null, ['uri' => 'noganluonguri']);
$server->setObject(new NganluongServer());
ob_start();
$server->handle();
return ob_get_clean();
登录后复制

上边这段代码是无wsdl模式下的,但是这次是对接第三方的服务,需要我们这边去定义soap webservice,第三方来调用,第三方定义的是wsdl模式的,所以今天研究了下。

laravel代码示例(其它框架类似思考方式):

  • 主要逻辑代码 - SoapService.php

<?php /**
 * soap服务端
 */

namespace App\Services;

Class SoapService
{
    public function getSum($param1, $param2)
    { 
        return $param1 + $param2;
    }
}
登录后复制
  • 创建路由

$api-&gt;any('soapUrl', 'SoapCallbackController@soapFun');
登录后复制
  • 路由主要实现方法-wsdl不存在则创建,不需要手动创建,url:https:xxx/soapurl?wsdl

<?php Class SoapCallbackController {
    public function soapFun()
        {
            try {
                $procClass     = &#39;App\Services\SoapService&#39;;
                $classNameFull = explode(&#39;\\&#39;, $procClass);
                $className     = array_pop($classNameFull);
                $storagePath   = storage_path();
                if (! file_exists($storagePath . &#39;/wsdl/&#39; . $className . &#39;.wsdl&#39;)) {
                    if (! file_exists($storagePath . &#39;/wsdl/&#39;)) {
                        mkdir($storagePath . &#39;/wsdl/&#39;, 0777, true);
                    }
                    require_once app_path() . &#39;/Libs/SoapDiscovery.php&#39;;
       
                    $soapDiscovery = new \SoapDiscovery($procClass, &#39;soap&#39;);
                    $file          = fopen($storagePath . &#39;/wsdl/&#39; . $className . &#39;.wsdl&#39;, &#39;w&#39;);
                    fwrite($file, $soapDiscovery->getWSDL());
                    fclose($file);
                }
                $server = new \SoapServer($storagePath . '/wsdl/' . $className . '.wsdl', array('soap_version' =&gt; SOAP_1_2));
                $server-&gt;setClass($procClass);
                $server-&gt;handle();
            } catch (\Exception $e) {
                Log::error('wsdl服务创建异常');
            }
        }
    }
登录后复制
  • 生成wsdl类 - SoapDiscovery.php

<?php /**
 * Copyright (c) 2005, Braulio Jos?Solano Rojas
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 * 
 *     Redistributions of source code must retain the above copyright notice, this list of
 *     conditions and the following disclaimer. 
 *     Redistributions in binary form must reproduce the above copyright notice, this list of
 *     conditions and the following disclaimer in the documentation and/or other materials
 *     provided with the distribution. 
 *     Neither the name of the Solsoft de Costa Rica S.A. nor the names of its contributors may
 *     be used to endorse or promote products derived from this software without specific
 *     prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 *
 * @version $Id$
 * @copyright 2005 
 */

/**
 * SoapDiscovery Class that provides Web Service Definition Language (WSDL).
 * 
 * @package SoapDiscovery
 * @author Braulio Jos?Solano Rojas
 * @copyright Copyright (c) 2005 Braulio Jos?Solano Rojas
 * @version $Id$
 * @access public
 * */
class SoapDiscovery {

    private $class_name = &#39;&#39;;
    private $service_name = &#39;&#39;;

    /**
     * SoapDiscovery::__construct() SoapDiscovery class Constructor.
     * 
     * @param string $class_name
     * @param string $service_name
     * */
    public function __construct($class_name = &#39;&#39;, $service_name = &#39;&#39;) {
        $this->class_name = $class_name;
        $this-&gt;service_name = $service_name;
    }

    /**
     * SoapDiscovery::getWSDL() Returns the WSDL of a class if the class is instantiable.
     * 
     * @return string
     * */
    public function getWSDL() {
        if (empty($this-&gt;service_name)) {
            throw new Exception('No service name.');
        }
        $headerWSDL = "<?xml  version=\"1.0\" ?>\n";
        $headerWSDL.= "<definitions>service_name\" targetNamespace=\"urn:$this-&gt;service_name\" xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\" xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\" xmlns:tns=\"urn:$this-&gt;service_name\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns=\"http://schemas.xmlsoap.org/wsdl/\"&gt;\n";
        $headerWSDL.= "<types></types>\n";

        if (empty($this-&gt;class_name)) {
            throw new Exception('No class name.');
        }

        $class = new ReflectionClass($this-&gt;class_name);

        if (!$class-&gt;isInstantiable()) {
            throw new Exception('Class is not instantiable.');
        }

        $methods = $class-&gt;getMethods();

        $portTypeWSDL = '<porttype>service_name . 'Port"&gt;';
        $bindingWSDL = '<binding>service_name . 'Binding" type="tns:' . $this-&gt;service_name . "Port\"&gt;\n<binding></binding>\n";
        $serviceWSDL = '<service>service_name . "\"&gt;\n<documentation></documentation>\n<port>service_name . 'Port" binding="tns:' . $this-&gt;service_name . "Binding\"&gt;<address></address>\n</port>\n</service>\n";
        $messageWSDL = '';
        foreach ($methods as $method) {
            if ($method-&gt;isPublic() &amp;&amp; !$method-&gt;isConstructor()) {
                $portTypeWSDL.= '<operation>getName() . "\"&gt;\n" . '<input>getName() . "Request\" /&gt;\n<output>getName() . "Response\" /&gt;\n</output></operation>\n";
                $bindingWSDL.= '<operation>getName() . "\"&gt;\n" . '<operation>service_name . '#' . $this-&gt;class_name . '#' . $method-&gt;getName() . "\" /&gt;\n<input><body>service_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" /&gt;\n\n<output>\n<body>service_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" /&gt;\n</body></output>\n</body></operation></operation>\n";
                $messageWSDL.= '<message>getName() . "Request\"&gt;\n";
                $parameters = $method-&gt;getParameters();
                foreach ($parameters as $parameter) {
                    $messageWSDL.= '<part>getName() . "\" type=\"xsd:string\" /&gt;\n";
                }
                $messageWSDL.= "</part></message>\n";
                $messageWSDL.= '<message>getName() . "Response\"&gt;\n";
                $messageWSDL.= '<part>getName() . "\" type=\"xsd:string\" /&gt;\n";
                $messageWSDL.= "</part></message>\n";
            }
        }
        $portTypeWSDL.= "</binding></porttype>\n";
        $bindingWSDL.= "\n";
        //return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>');
        //生成wsdl文件,将上面的return注释
        $fso = fopen($this-&gt;class_name . ".wsdl", "w");
        fwrite($fso, sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, ''));
    }

    /**
     * SoapDiscovery::getDiscovery() Returns discovery of WSDL.
     * 
     * @return string
     * */
    public function getDiscovery() {
        return "<?xml  version=\"1.0\" ?>\n<discovery>\n<contractref></contractref>\n</discovery>";
    }

}

?&gt;
登录后复制
  • webservice测试

<?php // 关闭wsdl缓存
ini_set(&#39;soap.wsdl_cache_enabled&#39;, "0");

$soap = new SoapClient(&#39;https:xxx/soapurl?wsdl&#39;);
// 以下两种调用方式
echo $soap->getSum(10, 24);
echo $soap-&gt;__soapCall('getSum',array(10,24));
登录后复制

以上就是laravel框架下soapServer支持wsdl的代码示例的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
相关标签:
来源:segmentfault网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号