mathielen / cxml
2.0RC2
2024-09-17 11:32 UTC
Requires
- php: ^8.2
- ext-dom: *
- ext-libxml: *
- ext-simplexml: *
- beberlei/assert: @stable
- jms/serializer: ^3.30.0
- psr/event-dispatcher: ^1.0.0
- psr/log: ^1.0 || ^2.0 || ^3.0
Requires (Dev)
- enlightn/security-checker: *
- friendsofphp/php-cs-fixer: *
- goetas/jms-serializer-phpstan-extension: ^1.0
- php-parallel-lint/php-parallel-lint: *
- phpstan/extension-installer: ^1.3
- phpstan/phpstan: ^1.11.0
- phpstan/phpstan-deprecation-rules: ^1.2
- phpstan/phpstan-strict-rules: ^1.6
- phpunit/phpunit: ^11
- rector/rector: ^1.1
- symfony/routing: ^4.4.44 || ^5.0.0 || ^6.0.0 || ^7.0.0
- tomasvotruba/type-coverage: ^0.3.0
Suggests
- symfony/routing: If you want to use SelfAwareProfileRequestHandler
README
cXML 是一种简化的协议,旨在实现采购应用程序、电子商务中心和供应商之间业务文档的一致性通信。 http://cxml.org/
cXML 参考指南(PDF): http://xml.cxml.org/current/cXMLReferenceGuide.pdf
状态
入门
安装
$ composer require friendsofcxml/cxml-php
然后包含 Composer 的自动加载器
require_once 'vendor/autoload.php';
获取当前 dtd 定义文件
- 从 http://cxml.org/downloads.html 下载当前规范
- 提取文件
- 使用 cXML.dtd 进行验证(见下文)
快速入门
身份和凭证
//we use a basic registry here. You could use your own (db-based?) repository that implements CredentialRepositoryInterface $credentialRegistry = new \CXml\Credential\Registry(); $someSupplier = new \CXml\Model\Credential('DUNS', 12345); $credentialRegistry->registerCredential($someSupplier); $someBuyer = new \CXml\Model\Credential('my-id-type', "buyer@domain.com"); $credentialRegistry->registerCredential($someBuyer); $someHub = new \CXml\Model\Credential('my-id-type', "hub@domain.com", "abracadabra"); $credentialRegistry->registerCredential($someHub);
注册处理器
$handlerRegistry = new \CXml\Handler\HandlerRegistry(); $handlerRegistry->register(new CXml\Handler\Request\SelfAwareProfileRequestHandler(...)); $handlerRegistry->register(new CXml\Handler\Request\StaticStartPagePunchOutSetupRequestHandler(...)); $handlerRegistry->register(new MyOrderRequestHandler()); $handlerRegistry->register(new MyStatusUpdateRequestHandler()); ...
构建 cXML
//$payload = new \CXml\Model\Message\...Message(...); //or... //$payload = new \CXml\Model\Request\...Request(...); //or... $payload = new \CXml\Model\Response\...Response(...); $cXml = \CXml\Builder::create() ->payload($payload) ->build(); $payload = new \CXml\Model\Request\...Request(...); $cXml = \CXml\Builder::create() ->payload($payload) ->from(...) ->to(...) ->sender(...) ->build();
注册出站 cXML 文档
您可能希望注册发送的文档,以便后续请求文档可以通过 payloadId 引用。
$documentRegistory = new MyDocumentRegistry(); //implements CXml\Document\DocumentRegistryInterface $documentRegistory->register($cXml);
处理入站 cXML 文档
$headerProcessor = new \CXml\Processor\HeaderProcessor($credentialRegistry, $credentialRegistry); $cXmlProcessor = new \CXml\Processor\Processor( $headerProcessor, $handlerRegistry, $builder ); $cXmlProcessor->process($cXml);
整合所有内容
$credentialRegistry = new \CXml\Credential\Registry(); //TODO register... $handlerRegistry = new \CXml\Handler\HandlerRegistry(); //TODO register... $builder = \CXml\Builder::create(); $headerProcessor = new \CXml\Processor\HeaderProcessor($credentialRegistry, $credentialRegistry); $cXmlProcessor = new \CXml\Processor\Processor( $headerProcessor, $handlerRegistry, $builder ); $pathToDtd = '.'; //point the directory with extracted contents of zip-file with the DTDs, downloaded from cxml.org $dtdValidator = new \CXml\Validation\DtdValidator($pathToDtd); $endpoint = new \CXml\Endpoint( $dtdValidator, $cXmlProcessor ); //$xmlString could be the body of an incoming http request $xmlString = '<cXML>...</cXML>'; $result = $endpoint->parseAndProcessStringAsCXml($xmlString); //$result could be null (i.e. for a Response or Message) or another CXml object which would be the Response to a Request //you would have to handle the transport yourself
处理日期与 DateTime
cXML 规范对于日期和时间的格式并不完全明确。规范指出,日期应格式化为“ISO 8601的受限子集”。这意味着格式可以是带有时间和时区信息的完整 ISO 8601 格式(即 2015-04-14T13:36:00-08:00)或没有时间和时区的格式(2015-04-14)。
对于某些字段,一天中的实际时间并不重要,可能会导致混淆。例如,在 ItemOut 中的 requestedDeliveryDate 字段。现实世界的经验表明,这里通常只指定日期。尽管可以争论说,对于紧密的按时交付来说,一天中的时间仍然很重要。
为了解决这个问题,我们引入了一个明确的 CXml\Model\Date 类来处理显式日期(不带时间)。此类扩展 DateTime,因此与模型的其他部分兼容。该类强制执行仅日期的表示(Y-m-d)。
序列化
当您生成对象图并希望输出仅日期值时,应使用 CXml\Model\Date 类。
反序列化
当从 cXML 文档解析日期属性时,如果发现了仅日期的值(Y-m-d),则会实例化 CXml\Model\Date。
致谢
- Markus Thielen (https://github.com/mathielen)