proengeno/edifact

此包已被废弃且不再维护。作者建议使用apfelfrisch/edifact包。

解析、构建、序列化和验证UN/EDIFACT消息

1.3.1 2024-03-12 13:07 UTC

README

Unit test Static Analysis Mutation tests

以内存高效的方式解析、构建、序列化和验证UN/EDIFACT消息。

你可能需要自己生成自己的段,有关XML映射,请参阅php-edifact/edifact-mapping。我已经为自动生成做了原型,它应该为你提供一个良好的起点。

如果你不需要验证或段获取器,你也可以解析到通用段。

使用方法

解析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;
    }
}