
중요 : 최소 지원 PHP 버전이 8.0으로 업데이트되었습니다.
마지막으로 지원되는 버전 :
-> PHP 7.0 또는 7.1 => 1.5.4
-> PHP 7.2 => 2.0.2
-> PHP 7.4 => 2.1.7
유명한 Perl Net-HL7 패키지에서 영감을 얻은 PHP 기반 HL7 V2.X 구문 분석, 생성 및 보내기 라이브러리.
composer require aranyasen/hl7 // First, import classes from the library as needed...
use Aranyasen HL7 ; // HL7 factory class
use Aranyasen HL7 Message ; // If Message is used
use Aranyasen HL7 Segment ; // If Segment is used
use Aranyasen HL7 Segments MSH ; // If MSH is used
// ... and so on // Create a Message object from a HL7 string
$ message = HL7 :: from ( " MSH|^~ \ &|1| " )-> createMessage (); // Returns Message object
// Or, using Message class...
$ message = new Message ( " MSH|^~ \ &|1| r PID|||abcd| r" ); // Either n or r can be used as segment endings
// Get string form of the message
echo $ message -> toString ( true );
// Extracting segments and fields from a Message object...
$ message -> getSegmentByIndex ( 1 ); // Get the first segment
$ message -> getSegmentsByName ( ' ABC ' ); // Get an array of all 'ABC' segments
$ message -> getFirstSegmentInstance ( ' ABC ' ); // Returns the first ABC segment. Same as $message->getSegmentsByName('ABC')[0];
// Check if a segment is present in the message object
$ message -> hasSegment ( ' ABC ' ); // return true or false based on whether PID is present in the $message object
// Check if a message is empty
$ message = new Message ();
$ message -> isempty (); // Returns true // The class `HL7` can be used to build HL7 object. It is a factory class with various helper methods to help build a hl7.
$ message = HL7 :: build ()-> createMessage (); // Creates an empty message
// The HL7 factory class provides methods that can be chained together in a fluent fashion
$ message = HL7 :: build ()
-> withComponentSeparator ( ' # ' )
-> withFieldSeparator ( ' - ' )
-> createMessage ();
// Or, using Message class...
$ message = new Message (); // When a message is composed using Message class, there are multiple parameters available to define the properties of the HL7.
// Note: All of these properties are available as fluent methods in HL7 factory class (shown above). So it's recommended to use that for readability
// Creating multiple message objects may have an unexpected side effect: segments start with wrong index values (Check tests/MessageTest for explanation)...
// Use 4th argument as true, or call resetSegmentIndices() on $message object to reset segment indices to 1
$ message = new Message ( " MSH|^~&|||||||ORM^O01||P|2.3.1| " , null , true , true );
// ... any segments added here will now start index from 1, as expected. // Sometimes you may want to have exact index values, rather than auto-incrementing for each instance of a segment
// Use 5th argument as false...
$ hl7String = " MSH|^~&|||||||ORU^R01|00001|P|2.3.1| n" . " OBX|1||11^AA| n" . " OBX|1||22^BB| n" ;
$ message = new Message ( $ hl7String , null , true , true , false ); $ // $message contains both OBXs with given indexes in the string // Create a segment with empty sub-fields retained
$ message = new Message ( " MSH|^~ \ &|1| r PV1|1|O|^AAAA1^^^BB| " , null , true ); // Third argument 'true' forces to keep all sub-fields
$ pv1 = $ message -> getSegmentByIndex ( 1 );
$ fields = $ pv1 -> getField ( 3 ); // $fields is ['', 'AAAA1', '', '', 'BB']
// Create/send message with segment-ending bar character (|) removed
$ message = new Message ( " MSH|^~ \ &|1| n ABC|||xxx n" , [ ' SEGMENT_ENDING_BAR ' => false ]);
$ message -> toString ( true ); // Returns "MSH|^~&|1nABC|||xxxn"
( new Connection ( $ ip , $ port ))-> send ( $ message ); // Sends the message without ending bar-characters (details on Connection below)
// Specify custom values for separators, HL7 version etc.
$ message = new Message ( " MSH|^~ \ &|1| r PV1|1|O|^AAAA1^^^BB| " , [ ' SEGMENT_SEPARATOR ' => ' rn ' , ' HL7_VERSION ' => ' 2.3 ' ]);
// Segment with separator character (~) creates sub-arrays containing each sub-segment
$ message = new Message ( " MSH|^~&|||||||ADT^A01||P|2.3.1| n PID|||3^0~4^1 " ); // Creates [[3,0], [4,1]]
// To create a single array instead, pass 'true' as 6th argument. This may be used to retain behavior from previous releases
// Notice: Since this leads to a non-standard behavior, it may be removed in future
$ message = new Message ( " MSH|^~&|||||||ADT^A01||P|2.3.1| n PID|||3^0~4^1 " , null , false , false , true , true ); // Creates ['3', '0~4', '1']
// or
$ message = new Message ( " MSH|^~&|||||||ADT^A01||P|2.3.1| n PID|||3^0~4^1 " , doNotSplitRepetition: true ); // Creates ['3', '0~4', '1'] // Once a message object is created, we can now add, insert, set segments and fields.
// Create a MSH segment and add to message object
$ msh = new MSH ();
$ message -> addSegment ( $ msh ); // Message is: "MSH|^~&|||||20171116140058|||2017111614005840157||2.3|n"
// Create a custom segment
$ abc = new Segment ( ' ABC ' );
$ abc -> setField ( 1 , ' xyz ' );
$ abc -> setField ( 2 , 0 );
$ abc -> setField ( 4 , [ '' ]); // Set an empty field at 4th position. 2nd and 3rd positions will be automatically set to empty
$ abc -> clearField ( 2 ); // Clear the value from field 2
$ message -> setSegment ( $ abc , 1 ); // Message is now: "MSH|^~&|||||20171116140058|||2017111614005840157||2.3|nABC|xyz|n"
// Create a defined segment (To know which segments are defined in this package, look into Segments/ directory)
// Advantages of defined segments over custom ones (shown above) are 1) Helpful setter methods, 2) Auto-incrementing segment index
$ pid = new PID (); // Automatically creates PID segment, and adds segment index at PID.1
$ pid -> setPatientName ([ $ lastname , $ firstname , $ middlename , $ suffix ]); // Use a setter method to add patient's name at standard position (PID.5)
$ pid -> setField ( ' abcd ' , 5 ); // Apart from standard setter methods, you can manually set a value at any position too
unset( $ pid ); // Destroy the segment and decrement the id number. Useful when you want to discard a segment.
// It is possible that segments get added in a way that the Set IDs/Sequence IDs within the message are not in order or leave gaps. To reset all Set/Sequence IDs in the message:
$ message -> reindexSegments ();참고 사항 : 연결을 실행하려면 PHP Ext-Sockets를 설치해야합니다 https://www.php.net/manual/en/sockets.installation.php
$ ip = ' 127.0.0.1 ' ; // An IP
$ port = ' 12001 ' ; // And Port where a HL7 listener is listening
$ message = new Message ( $ hl7String ); // Create a Message object from your HL7 string
// Create a Socket and get ready to send message. Optionally add timeout in seconds as 3rd argument (default: 10 sec)
$ connection = new Connection ( $ ip , $ port );
$ response = $ connection -> send ( $ message ); // Send to the listener, and get a response back
echo $ response -> toString ( true ); // Prints ACK from the listener원격 HL7 리스너에서 반환 된 ACK 메시지 처리 ...
$ ack = ( new Connection ( $ ip , $ port ))-> send ( $ message ); // Send a HL7 to remote listener
$ returnString = $ ack -> toString ( true );
if ( strpos ( $ returnString , ' MSH ' ) === false ) {
echo " Failed to send HL7 to 'IP' => $ ip , 'Port' => $ port " ;
}
$ msa = $ ack -> getFirstSegmentInstance ( ' MSA ' );
$ ackCode = $ msa -> getAcknowledgementCode ();
if ( $ ackCode [ 1 ] === ' A ' ) {
echo " Received ACK from remote n" ;
}
else {
echo " Received NACK from remote n" ;
echo " Error text: " . $ msa -> getTextMessage ();
}주어진 HL7 메시지에서 ACK 응답 생성 :
$ msg = new Message ( " MSH|^~ \ &|1| r ABC|1||^AAAA1^^^BB| " , null , true );
$ ackResponse = new ACK ( $ msg );ACK 객체를 작성하는 동안 옵션을 전달할 수 있습니다.
$ msg = new Message ( " MSH|^~ \ &|1| r ABC|1||^AAAA1^^^BB| " , null , true );
$ ackResponse = new ACK ( $ msg , null , [ ' SEGMENT_SEPARATOR ' => ' rn ' , ' HL7_VERSION ' => ' 2.5 ' ]);이 패키지는 편리한 HL7 처리를위한 여러 공개 방법을 노출시킵니다. 몇 가지 예는 다음과 같습니다.
$msg = new Message(file_get_contents('somefile.hl7')); ) $ msg -> toFile ( ' /path/to/some.hl7 ' ); // Write to a file
$ msg -> isOru (); // Check if it's an ORU
$ msg -> isOrm (); // Check if it's an ORM사용 가능한 API에 대한 자세한 내용은 Docs Readme를 방문하십시오
모든 세그먼트 레벨 Getter/Setter API는 두 가지 방법으로 사용할 수 있습니다.
위치 색인이 인수로 제공되지 않으면 (Getters의 첫 번째 인수, 세터의 경우 2 위) 표준 색인이 사용됩니다. $pid->setPatientName('John Doe') -> HL7 v2.3 표준 $pid->getPatientAddress() 에 따라 위치 5에서 환자 이름을 설정하십시오.
사용자 정의 위치 색인을 사용하려면 다음과 같은 인수에 제공하십시오 : $pid->setPatientName('John Doe', 6) -> PID 세그먼트에서 6 번째 위치에서 환자 이름을 설정하십시오 $pid->getPatientAddress(12) -> 12 번째 위치에서 환자 주소를 얻으십시오.
버그 보고서 및 기능 요청은 Github 문제 추적기에 제출할 수 있습니다.
정보는 Contributing.md를 참조하십시오.