apfelfrisch / edifact
解析、构建、序列化和验证 UN/EDIFACT 消息
1.3.1
2024-03-12 13:07 UTC
Requires
- php: ~8.1.0 || ~8.2.0 || ~8.3.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.51
- infection/infection: ^0.27.10
- phpstan/phpstan: ^1.10
- phpstan/phpstan-phpunit: ^1.3
- phpunit/phpunit: ^10.5
README
以内存高效的方式解析、构建、序列化和验证 UN/EDIFACT 消息。
你可能需要自己生成段,查看 php-edifact/edifact-mapping 以获取 XML 映射。我已经为自动生成做了原型,它应该为你提供一个良好的起点。
如果你不需要验证或段获取器,你也可以解析到通用的段。
用法
解析 EDIFACT 消息
加载段类
你可以这样将你的段添加到工厂中
use Apfelfrisch\Edifact\Segment\SegmentFactory; $segmentFactory = new SegmentFactory; $segmentFactory->addSegment('SEQ', \My\Namespace\Segments\Seq::class);
之后,你可以将工厂标记为默认的
$segmentFactory->markAsDefault();
或者将工厂注入到消息中
use Apfelfrisch\Edifact\Segment\SegmentFactory; $message = Message::fromString("UNA:+.? 'SEQ+1", $segmentFactory);
如果你不需要验证或段获取器,你也可以解析到通用的段
use Apfelfrisch\Edifact\Segments\Generic; use Apfelfrisch\Edifact\Segment\SegmentFactory; $segmentFactory = new SegmentFactory; $segmentFactory->addFallback(Generic::class); $segmentFactory->markAsDefault();
从字符串解析
use Apfelfrisch\Edifact\Message; $message = Message::fromString("UNA:+.? 'NAD+DP++++Musterstr.::10+City++12345+DE");
从文件解析
use Apfelfrisch\Edifact\Message; $message = Message::fromFilepath('path/to/file.txt');
遍历段
use Apfelfrisch\Edifact\Segments\SegmentInterface; foreach ($message->getSegments() as $segment) { if ($segment instanceof SegmentInterface) { echo $segment->name(); } }
过滤段
use My\Namespace\Segments\MyNad; foreach ($message->filterSegments(MyNad::class) as $segment) { echo $segment->name(); // NAD } $message->filterSegments(MyNad::class, fn(Nad $seg): bool => $seg->street() === 'Musterstr.' ); echo $message->findFirstSegment(MyNad::class)->name(); // NAD
解包消息
foreach ($message->unwrap() as $partialMessage) { echo $segment instanceof \Apfelfrisch\Edifact\Message; }
添加读取过滤器
$message->addStreamFilter('iso-to-utf8', 'convert.iconv.ISO-8859-1.UTF-8');
构建消息
使用默认的 UNA 构建
use Apfelfrisch\Edifact\Builder; use Apfelfrisch\Edifact\Message; use My\Namespace\Segments\MyUnb; use My\Namespace\Segments\MyUnh; $builder = new Builder; $builder->writeSegments( MyUnb::fromAttributes('1', '2', 'sender', '500', 'receiver', '400', new DateTime('2021-01-01 12:01:01'), 'unb-ref'), MyUnh::fromAttributes('unh-ref', 'type', 'v-no', 'r-no', 'o-no', 'o-co') ); $message = new Message($builder->get());
UNA 和后续段(UNT 和 UNZ)将自动添加。如果没有提供 UNA 段,则使用默认值 [UNA:+.? '].
使用自定义 UNA 构建
use Apfelfrisch\Edifact\Builder; use Apfelfrisch\Edifact\Segment\UnaSegment; $builder = new Builder(new UnaSegment('|', '#', ',', '!', '_', '"'));
如果你替换了小数分隔符,请确保蓝图将值标记为数值。
直接写入文件
use Apfelfrisch\Edifact\Builder; use Apfelfrisch\Edifact\Segment\UnaSegment; $builder = new Builder(new UnaSegment, 'path/to/file.txt');
向构建器添加写入过滤器
use Apfelfrisch\Edifact\Builder; $builder = new Builder; $builder->addStreamFilter('utf8-to-iso', 'convert.iconv.UTF-8.ISO-8859-1');
验证消息段
use Apfelfrisch\Edifact\Message; use Apfelfrisch\Edifact\Validation\Failure; use Apfelfrisch\Edifact\Validation\Validator; $message = Message::fromString("UNA:+.? 'SEQ+9999", $segmentFactory); $validator = new Validator; if(! $validator->isValid($message)) { foreach ($validator->getFailures() as $failure) { echo $failure instanceof Failure; } }