goetas-webservices/xsd2php
Composer 安装命令:
composer require goetas-webservices/xsd2php
包简介
Convert XSD (XML Schema) definitions into PHP classes and JMS metadata
关键字:
README 文档
README
UKRAINE NEEDS YOUR HELP NOW!
On 24 February 2022, Russian President Vladimir Putin ordered an invasion of Ukraine by Russian Armed Forces.
Your support is urgently needed.
- Donate to the volunteers. Here is the volunteer fund helping the Ukrainian army to provide all the necessary equipment: https://bank.gov.ua/en/news/all/natsionalniy-bank-vidkriv-spetsrahunok-dlya-zboru-koshtiv-na-potrebi-armiyi or https://savelife.in.ua/en/donate/
- Triple-check social media sources. Russian disinformation is attempting to coverup and distort the reality in Ukraine.
- Help Ukrainian refugees who are fleeing Russian attacks and shellings: https://www.globalcitizen.org/en/content/ways-to-help-ukraine-conflict/
- Put pressure on your political representatives to provide help to Ukraine.
- Believe in the Ukrainian people, they will not surrender, they don't have another Ukraine.
THANK YOU!
xsd2php
Convert XSD into PHP classes.
With goetas-webservices/xsd2php you can convert any XSD/WSDL definition into PHP classes.
XSD2PHP can also generate JMS Serializer compatible metadata that can be used to serialize/unserialize the object instances.
Installation
There is one recommended way to install xsd2php via Composer:
- adding the dependency to your
composer.jsonfile:
"require": { .. "goetas-webservices/xsd2php-runtime":"^0.2.2", .. }, "require-dev": { .. "goetas-webservices/xsd2php":"^0.3", .. },
Usage
With this example we will convert OTA XSD definitions into PHP classes.
Suppose that you have all XSD files in /home/my/ota, first of all we need a configuration file
(as example config.yml) that will keep all the namespace and directory mappings information.
# config.yml # Linux Users: PHP Namespaces use back slash \ rather than a forward slash / # So for destinations_php, the namespace would be TestNs\MyApp xsd2php: namespaces: 'http://www.example.org/test/': 'TestNs\MyApp' destinations_php: 'TestNs\MyApp': soap/src # 'TestNs\MyApp': soap\src # on Windows destinations_jms: 'TestNs\MyApp': soap/metadata # 'TestNs\MyApp': soap\metadata # on Windows # Uncomment this section if you want to have also symfony/validator metadata to be generated from XSD # destinations_validation: # 'TestNs\MyApp': soap/validation # 'TestNs\MyApp': soap\validation # on Windows aliases: # optional 'http://www.example.org/test/': MyCustomXSDType: 'MyCustomMappedPHPType' naming_strategy: short # optional and default path_generator: psr4 # optional and default # known_locations: # optional # "http://www.example.org/test/somefile.xsd": somefile.xsd # known_namespace_locations: # optional # "urn:veloconnect:catalog-1.1": xsd/catalog-1.1.xsd # configs_jms: #optional # xml_cdata: false # Disables CDATA
Here is an explanation on the meaning of each parameter:
-
xsd2php.namespaces(required) defines the mapping between XML namespaces and PHP namespaces. (in the example we have thehttp://www.example.org/test/XML namespace mapped toTestNs\MyApp) -
xsd2php.destinations_php(required) specifies the directory where to save the PHP classes that belongs toTestNs\MyAppPHP namespace. (in this exampleTestNs\MyAppclasses will be saved intosoap/srcdirectory. -
xsd2php.destinations_jms(required) specifies the directory where to save JMS Serializer metadata files that belongs toTestNs\MyAppPHP namespace. (in this exampleTestNs\MyAppmetadata will be saved intosoap/metadatadirectory. -
xsd2php.aliases(optional) specifies some mappings that are handled by custom JMS serializer handlers. Allows to specify to do not generate metadata for some XML types, and assign them directly a PHP class. For that PHP class is necessary to create a custom JMS serialize/deserialize handler. -
xsd2php.naming_strategy(optional) specifies the naming strategy to use when converting XML names PHP classes. -
xsd2php.path_generator(optional) specifies the strategy to use for path generation and file saving -
xsd2php.known_locations(optional) override remote location with a local file. -
xsd2php.known_namespace_locations(optional) Specify schema location by namespace. This can be used to read schemas which import namespaces but do not specify schemaLocation attributes. -
xsd2php.configs_jms.xml_cdata(optional) Specify if CDATA should be used or not in serialization.
Generate PHP classes and JMS metadata info
vendor/bin/xsd2php convert config.yml /home/my/ota/OTA_Air*.xsd
This command will generate PHP classes and JMS metadata files for all the XSD files matching /home/my/ota/OTA_Air*.xsd
and using the configuration available in config.yml
Serialize / Unserialize
XSD2PHP can also generate for you JMS Serializer metadata that you can use to serialize/unserialize the generated PHP class instances.
The parameter aliases in the configuration file, will instruct XSD2PHP to not generate any metadata information or
PHP class for the {http://www.example.org/test/}MyCustomXSDType type.
All reference to this type are replaced with the MyCustomMappedPHPType name.
You have to provide a custom serializer for this type/alis.
Here is an example on how to configure JMS serializer to handle custom types
<?php use JMS\Serializer\SerializerBuilder; use JMS\Serializer\Handler\HandlerRegistryInterface; use GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\BaseTypesHandler; use GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\XmlSchemaDateHandler; $serializerBuilder = SerializerBuilder::create(); $serializerBuilder->addMetadataDir('metadata dir', 'TestNs'); $serializerBuilder->configureHandlers(function (HandlerRegistryInterface $handler) use ($serializerBuilder) { $serializerBuilder->addDefaultHandlers(); $handler->registerSubscribingHandler(new BaseTypesHandler()); // XMLSchema List handling $handler->registerSubscribingHandler(new XmlSchemaDateHandler()); // XMLSchema date handling // $handler->registerSubscribingHandler(new YourhandlerHere()); }); $serializer = $serializerBuilder->build(); // deserialize the XML into Demo\MyObject object $object = $serializer->deserialize('<some xml/>', 'TestNs\MyObject', 'xml'); // some code .... // serialize the Demo\MyObject back into XML $newXml = $serializer->serialize($object, 'xml');
To disable the CDATA, configure JMS as so:
xsd2php: configs_jms: xml_cdata: false
Validation
<?php use Symfony\Component\Validator\Validation; // get the validator $builder = Validation::createValidatorBuilder(); foreach (glob('soap/validation/*.yml') as $file) { $builder->addYamlMapping($file); } $validator = $builder->getValidator(); // validate $object $violations = $validator->validate($object, null, ['xsd_rules']);
Dealing with xsd:anyType or xsd:anySimpleType
If your XSD contains xsd:anyType or xsd:anySimpleType types you have to specify a handler for this.
When you generate the JMS metadata you have to specify a custom handler:
# config.yml xsd2php: ... aliases: 'http://www.w3.org/2001/XMLSchema': anyType: 'MyCustomAnyTypeHandler' anySimpleType: 'MyCustomAnySimpleTypeHandler'
Now you have to create a custom serialization handler:
use JMS\Serializer\XmlSerializationVisitor; use JMS\Serializer\XmlDeserializationVisitor; use JMS\Serializer\Handler\SubscribingHandlerInterface; use JMS\Serializer\GraphNavigator; use JMS\Serializer\VisitorInterface; use JMS\Serializer\Context; class MyHandler implements SubscribingHandlerInterface { public static function getSubscribingMethods() { return array( array( 'direction' => GraphNavigator::DIRECTION_DESERIALIZATION, 'format' => 'xml', 'type' => 'MyCustomAnyTypeHandler', 'method' => 'deserializeAnyType' ), array( 'direction' => GraphNavigator::DIRECTION_SERIALIZATION, 'format' => 'xml', 'type' => 'MyCustomAnyTypeHandler', 'method' => 'serializeAnyType' ) ); } public function serializeAnyType(XmlSerializationVisitor $visitor, $data, array $type, Context $context) { // serialize your object here } public function deserializeAnyType(XmlDeserializationVisitor $visitor, $data, array $type) { // deserialize your object here } }
Naming Strategy
There are two types of naming strategies: short and long. The default is short, this naming strategy can however generate naming conflicts.
The long naming strategy will suffix elements with Element and types with Type.
MyNamespace\Userwill becomeMyNamespace\UserElementMyNamespace\UserTypewill becomeMyNamespace\UserTypeType
An XSD for instance with a type named User, a type named UserType, a root element named User and UserElement, will only work when using the long naming strategy.
- If you don't have naming conflicts and you want to have short and descriptive class names, use the
shortoption. - If you have naming conflicts use the
longoption. - If you want to be safe, use the
longoption.
Note
The code in this project is provided under the MIT license. For professional support contact goetas@gmail.com or visit https://www.goetas.com
goetas-webservices/xsd2php 适用场景与选型建议
goetas-webservices/xsd2php 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1.7M 次下载、GitHub Stars 达 240, 最近一次更新时间为 2016 年 05 月 22 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「php」 「xml」 「jms」 「serializer」 「converter」 「xsd」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 goetas-webservices/xsd2php 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 goetas-webservices/xsd2php 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 goetas-webservices/xsd2php 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Bridge between JMS Serializer Bundle and Superdesk Web Publisher.
This bridge allows you to use jms payment plugins but in payum like way.
Load DOM document safety
MongoDB support for JMSPaymentCoreBundle
Promoting the interoperability of MQs objects. Based on Java JMS, modernized with psalm typehints.
A nice answer factory for Laravel based on the jms/serializer
统计信息
- 总下载量: 1.7M
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 241
- 点击次数: 25
- 依赖项目数: 42
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2016-05-22