GraphQL 서버와의 상호 작용 프로세스를 매우 간단하게 만드는 매우 간단하면서도 강력한 쿼리 생성기 클래스를 제공하는 PHP로 작성된 GraphQL 클라이언트입니다.
이 패키지를 사용하여 GraphQL 쿼리를 생성하는 세 가지 기본 방법이 있습니다.
Query
개체를 동적으로 생성하는 데 사용할 수 있는 빌더 클래스입니다. 쿼리가 동적인 방식으로 작성되는 경우에 사용하도록 설계되었습니다.작곡가를 사용하여 패키지를 설치하려면 다음 명령을 실행하십시오.
$ composer require gmostafa/php-graphql-client
쿼리 를 작성해야 하는 번거로움을 피하고 API 스키마에서 생성된 PHP 객체와 상호 작용하려면 PHP GraphQL OQM 저장소를 방문하세요.
$ gql = ( new Query ( ' companies ' ))
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
);
이 간단한 쿼리는 이름과 일련번호를 표시하는 모든 회사를 검색합니다.
이전 예에서 제공된 쿼리는 "약식 형식"으로 표시됩니다. 단축 형식에는 쿼리 작성 프로세스 속도를 높이는 코드 줄 수를 줄여서 작성하는 작업이 포함됩니다. 다음은 이전 예에서 작성된 동일한 쿼리에 대한 전체 양식의 예입니다.
$ gql = ( new Query ())
-> setSelectionSet (
[
( new Query ( ' companies ' ))
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
)
]
);
예제에서 볼 수 있듯이 단축 형식은 읽고 쓰기가 더 간단하며 일반적으로 전체 형식에 비해 사용하는 것이 선호됩니다.
동일한 개체에서 여러 쿼리를 실행하려는 경우 쿼리가 하나의 사례만 있는 단축 형식으로 표현될 수 없는 경우가 아니면 전체 형식을 사용해서는 안 됩니다.
$ gql = ( new Query ())
-> setSelectionSet (
[
( new Query ( ' companies ' ))
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
),
( new Query ( ' countries ' ))
-> setSelectionSet (
[
' name ' ,
' code ' ,
]
)
]
);
이 쿼리는 각각에 대한 일부 데이터 필드를 표시하는 모든 회사와 국가를 검색합니다. 기본적으로 하나의 쿼리 개체 엔벨로프에서 두 개(또는 필요한 경우 그 이상)의 독립적인 쿼리를 실행합니다.
여러 쿼리를 작성하려면 각 쿼리를 상위 쿼리 개체 아래의 하위 필드로 나타내기 위해 전체 형식으로 쿼리 개체를 작성해야 합니다.
$ gql = ( new Query ( ' companies ' ))
-> setSelectionSet (
[
' name ' ,
' serialNumber ' ,
( new Query ( ' branches ' ))
-> setSelectionSet (
[
' address ' ,
( new Query ( ' contracts ' ))
-> setSelectionSet ([ ' date ' ])
]
)
]
);
이 쿼리는 스칼라 필드뿐만 아니라 개체 필드도 검색하는 더 복잡한 쿼리입니다. 이 쿼리는 이름, 일련 번호를 표시하는 모든 회사를 반환하고 각 회사의 모든 지점을 지점 주소를 표시하며 각 주소에 대해 이 주소에 바인딩된 모든 계약을 검색하여 날짜를 표시합니다.
$ gql = ( new Query ( ' companies ' ))
-> setArguments ([ ' name ' => ' Tech Co. ' , ' first ' => 3 ])
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
);
이 쿼리는 인수를 추가하여 모든 회사를 검색하지 않습니다. 이 쿼리는 이름이 "Tech Co."인 처음 3개의 회사를 검색하여 이름과 일련 번호를 표시합니다.
$ gql = ( new Query ( ' companies ' ))
-> setArguments ([ ' serialNumbers ' => [ 159 , 260 , 371 ]])
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
);
이 쿼리는 인수 쿼리의 특별한 경우입니다. 이 예에서 쿼리는 일련번호가 159, 260, 371 중 하나인 회사만 검색하여 이름과 일련번호를 표시합니다.
$ gql = ( new Query ( ' companies ' ))
-> setArguments ([ ' filter ' => new RawObject ( ' {name_starts_with: "Face"} ' )])
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
);
이 쿼리는 인수 쿼리의 또 다른 특별한 경우입니다. 이 예에서는 반환되는 회사를 제한하기 위해 일부 값을 사용하여 사용자 정의 입력 개체 "필터"를 설정합니다. "Face" 값으로 "name_starts_with" 필터를 설정하고 있습니다. 이 쿼리는 이름이 "Face"라는 문구로 시작하는 회사만 검색합니다.
생성되는 RawObject 클래스는 문자열을 쿼리에 그대로 삽입하는 데 사용됩니다. RawObject 생성자에 입력된 문자열은 쿼리 클래스에서 일반적으로 수행하는 사용자 정의 형식 없이 그대로 쿼리에 입력됩니다.
$ gql = ( new Query ( ' companies ' ))
-> setVariables (
[
new Variable ( ' name ' , ' String ' , true ),
new Variable ( ' limit ' , ' Int ' , false , 5 )
]
)
-> setArguments ([ ' name ' => ' $name ' , ' first ' => ' $limit ' ])
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
);
이 쿼리는 GraphQL 표준에 의해 활성화된 동적 요청을 허용하기 위해 이 패키지에서 변수를 사용하는 방법을 보여줍니다.
Variable 클래스는 GraphQL 표준에서 변수를 나타내는 불변 클래스입니다. 생성자는 4개의 인수를 받습니다:
$ gql = ( new Query ())
-> setSelectionSet (
[
( new Query ( ' companies ' , ' TechCo ' ))
-> setArguments ([ ' name ' => ' Tech Co. ' ])
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
),
( new Query ( ' companies ' , ' AnotherTechCo ' ))
-> setArguments ([ ' name ' => ' A.N. Other Tech Co. ' ])
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
)
]
);
동일한 객체를 다른 인수로 여러 번 검색해야 하는 경우를 위해 쿼리 생성자의 두 번째 인수에 별칭을 설정할 수 있습니다.
$ gql = ( new Query ( ' companies ' ))
-> setAlias ( ' CompanyAlias ' )
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
);
별명은 setter 메소드를 통해 설정할 수도 있습니다.
인터페이스 유형을 반환하는 필드를 쿼리할 때 인라인 조각을 사용하여 기본 구체적인 유형의 데이터에 액세스해야 할 수도 있습니다.
이 예에서는 이 패키지를 사용하여 인라인 조각을 생성하는 방법을 보여줍니다.
$ gql = new Query ( ' companies ' );
$ gql -> setSelectionSet (
[
' serialNumber ' ,
' name ' ,
( new InlineFragment ( ' PrivateCompany ' ))
-> setSelectionSet (
[
' boardMembers ' ,
' shareholders ' ,
]
),
]
);
QueryBuilder 클래스는 쿼리 개체를 동적으로 생성하는 데 사용할 수 있으며 이는 경우에 따라 유용할 수 있습니다. 이는 쿼리 클래스와 매우 유사하게 작동하지만 쿼리 작성은 여러 단계로 구분됩니다.
이것이 QueryBuilder를 사용하여 "입력 개체 인수를 사용한 쿼리" 예제를 생성할 수 있는 방법입니다.
$ builder = ( new QueryBuilder ( ' companies ' ))
-> setVariable ( ' namePrefix ' , ' String ' , true )
-> setArgument ( ' filter ' , new RawObject ( ' {name_starts_with: $namePrefix} ' ))
-> selectField ( ' name ' )
-> selectField ( ' serialNumber ' );
$ gql = $ builder -> getQuery ();
Query 클래스와 마찬가지로 별칭은 두 번째 생성자 인수를 사용하여 설정할 수 있습니다.
$ builder = ( new QueryBuilder ( ' companies ' , ' CompanyAlias ' ))
-> selectField ( ' name ' )
-> selectField ( ' serialNumber ' );
$ gql = $ builder -> getQuery ();
또는 setter 메소드를 통해
$ builder = ( new QueryBuilder ( ' companies ' ))
-> setAlias ( ' CompanyAlias ' )
-> selectField ( ' name ' )
-> selectField ( ' serialNumber ' );
$ gql = $ builder -> getQuery ();
Query 클래스와 마찬가지로 QueryBuilder 클래스도 전체 형식으로 작성되어 하나의 쿼리 빌더 개체 아래에 여러 쿼리를 작성할 수 있습니다. 다음은 QueryBuilder에서 전체 양식을 사용하는 방법에 대한 예입니다.
$ builder = ( new QueryBuilder ())
-> setVariable ( ' namePrefix ' , ' String ' , true )
-> selectField (
( new QueryBuilder ( ' companies ' ))
-> setArgument ( ' filter ' , new RawObject ( ' {name_starts_with: $namePrefix} ' ))
-> selectField ( ' name ' )
-> selectField ( ' serialNumber ' )
)
-> selectField (
( new QueryBuilder ( ' company ' ))
-> setArgument ( ' serialNumber ' , 123 )
-> selectField ( ' name ' )
);
$ gql = $ builder -> getQuery ();
이 쿼리는 이전 예의 쿼리를 확장한 것입니다. 이름 접두사로 시작하는 모든 회사를 반환하고 serialNumber
값이 123인 회사를 동일한 응답으로 반환합니다.
GraphQL 엔드포인트 URL을 제공하여 클라이언트 객체를 쉽게 인스턴스화할 수 있습니다.
클라이언트 생성자는 GraphQL 서버로 전송되는 모든 요청에 인증 헤더를 추가하는 데 사용할 수 있는 선택적 "authorizationHeaders" 배열도 받습니다.
예:
$ client = new Client (
' http://api.graphql.com ' ,
[ ' Authorization ' => ' Basic xyz ' ]
);
또한 클라이언트 생성자는 "authorizationHeaders"를 재정의하고 사용자 지정 Guzzle HTTP 클라이언트 요청 옵션을 추가하는 데 사용할 수 있는 선택적 "httpOptions" 배열을 받습니다.
예:
$ client = new Client (
' http://api.graphql.com ' ,
[],
[
' connect_timeout ' => 5 ,
' timeout ' => 5 ,
' headers ' => [
' Authorization ' => ' Basic xyz '
'User-Agent' => ' testing/1.0 ' ,
],
' proxy ' => [
' http ' => ' tcp://localhost:8125 ' , // Use this proxy with "http"
' https ' => ' tcp://localhost:9124 ' , // Use this proxy with "https",
' no ' => [ ' .mit.edu ' , ' foo.com ' ] // Don't use a proxy with these
],
' cert ' => [ ' /path/server.pem ' , ' password ' ]
. . .
]
);
PSR-18 인터페이스를 구현하는 사전 구성된 자체 HTTP 클라이언트를 사용할 수 있습니다.
예:
$ client = new Client (
' http://api.graphql.com ' ,
[],
[],
$ myHttpClient
);
GraphQL 클라이언트로 쿼리를 실행하고 객체 구조에서 결과를 가져옵니다.
$ results = $ client -> runQuery ( $ gql );
$ results -> getData ()-> companies [ 0 ]-> branches ;
또는 배열 구조에서 결과를 얻는 방법:
$ results = $ client -> runQuery ( $ gql , true );
$ results -> getData ()[ ' companies ' ][ 1 ][ ' branches ' ][ ' address ' ];
변수가 포함된 쿼리를 실행하려면 변수 이름(키)을 변수 값(값)으로 매핑하는 연관 배열을 runQuery
메서드에 전달해야 합니다. 예는 다음과 같습니다.
$ gql = ( new Query ( ' companies ' ))
-> setVariables (
[
new Variable ( ' name ' , ' String ' , true ),
new Variable ( ' limit ' , ' Int ' , false , 5 )
]
)
-> setArguments ([ ' name ' => ' $name ' , ' first ' => ' $limit ' ])
-> setSelectionSet (
[
' name ' ,
' serialNumber '
]
);
$ variablesArray = [ ' name ' => ' Tech Co. ' , ' first ' => 5 ];
$ results = $ client -> runQuery ( $ gql , true , $ variablesArray );
돌연변이는 GraphQL의 동일한 쿼리 규칙을 따르며, 반환된 객체에서 필드를 선택하고 인수를 수신하며 하위 필드를 가질 수 있습니다.
다음은 돌연변이를 구성하고 실행하는 방법에 대한 샘플 예입니다.
$ mutation = ( new Mutation ( ' createCompany ' ))
-> setArguments ([ ' companyObject ' => new RawObject ( ' {name: "Trial Company", employees: 200} ' )])
-> setSelectionSet (
[
' _id ' ,
' name ' ,
' serialNumber ' ,
]
);
$ results = $ client -> runQuery ( $ mutation );
쿼리가 실행되는 것과 동일한 방식으로 클라이언트에서 변형을 실행할 수 있습니다.
변형은 쿼리와 동일한 방식으로 변수를 활용할 수 있습니다. 다음은 변수를 사용하여 입력 개체를 GraphQL 서버에 동적으로 전달하는 방법에 대한 예입니다.
$ mutation = ( new Mutation ( ' createCompany ' ))
-> setVariables ([ new Variable ( ' company ' , ' CompanyInputObject ' , true )])
-> setArguments ([ ' companyObject ' => ' $company ' ]);
$ variables = [ ' company ' => [ ' name ' => ' Tech Company ' , ' type ' => ' Testing ' , ' size ' => ' Medium ' ]];
$ client -> runQuery (
$ mutation , true , $ variables
);
다음은 결과적인 돌연변이와 함께 전달된 변수입니다.
mutation( $ company : CompanyInputObject!) {
createCompany (companyObject: $ company )
}
{"company":{"name":"Tech Company", " type " :"Testing", " size " :"Medium"}}
GraphQL Pokemon은 포켓몬 데이터를 검색하는 데 사용할 수 있는 매우 멋진 공개 GraphQL API입니다. API는 웹에서 공개적으로 사용할 수 있으며 이를 사용하여 이 클라이언트의 기능을 시연할 것입니다.
Github 레포 링크: https://github.com/lucasbento/graphql-pokemon
API 링크: https://graphql-pokemon.now.sh/
이 쿼리는 포켓몬의 진화와 공격을 검색합니다.
query( $ name : String!) {
pokemon (name: $ name ) {
id
number
name
evolutions {
id
number
name
weight {
minimum
maximum
}
attacks {
fast {
name
type
damage
}
}
}
}
}
이것이 쿼리 클래스를 사용하여 이 쿼리를 작성하고 클라이언트를 사용하여 실행할 수 있는 방법입니다.
$ client = new Client (
' https://graphql-pokemon.now.sh/ '
);
$ gql = ( new Query ( ' pokemon ' ))
-> setVariables ([ new Variable ( ' name ' , ' String ' , true )])
-> setArguments ([ ' name ' => ' $name ' ])
-> setSelectionSet (
[
' id ' ,
' number ' ,
' name ' ,
( new Query ( ' evolutions ' ))
-> setSelectionSet (
[
' id ' ,
' number ' ,
' name ' ,
( new Query ( ' attacks ' ))
-> setSelectionSet (
[
( new Query ( ' fast ' ))
-> setSelectionSet (
[
' name ' ,
' type ' ,
' damage ' ,
]
)
]
)
]
)
]
);
try {
$ name = readline ( ' Enter pokemon name: ' );
$ results = $ client -> runQuery ( $ gql , true , [ ' name ' => $ name ]);
}
catch ( QueryError $ exception ) {
print_r ( $ exception -> getErrorDetails ());
exit ;
}
print_r ( $ results -> getData ()[ ' pokemon ' ]);
또는 QueryBuilder 클래스를 사용하여 이 쿼리를 생성할 수 있는 방법은 다음과 같습니다.
$ client = new Client (
' https://graphql-pokemon.now.sh/ '
);
$ builder = ( new QueryBuilder ( ' pokemon ' ))
-> setVariable ( ' name ' , ' String ' , true )
-> setArgument ( ' name ' , ' $name ' )
-> selectField ( ' id ' )
-> selectField ( ' number ' )
-> selectField ( ' name ' )
-> selectField (
( new QueryBuilder ( ' evolutions ' ))
-> selectField ( ' id ' )
-> selectField ( ' name ' )
-> selectField ( ' number ' )
-> selectField (
( new QueryBuilder ( ' attacks ' ))
-> selectField (
( new QueryBuilder ( ' fast ' ))
-> selectField ( ' name ' )
-> selectField ( ' type ' )
-> selectField ( ' damage ' )
)
)
);
try {
$ name = readline ( ' Enter pokemon name: ' );
$ results = $ client -> runQuery ( $ builder , true , [ ' name ' => $ name ]);
}
catch ( QueryError $ exception ) {
print_r ( $ exception -> getErrorDetails ());
exit ;
}
print_r ( $ results -> getData ()[ ' pokemon ' ]);
이 패키지의 기본 목표는 아니지만 Client
클래스의 runRawQuery
메서드를 사용하는 다른 클라이언트와 마찬가지로 원시 문자열 쿼리 실행을 지원합니다. 사용 방법에 대한 예는 다음과 같습니다.
$ gql = <<<QUERY
query {
pokemon(name: "Pikachu") {
id
number
name
attacks {
special {
name
type
damage
}
}
}
}
QUERY ;
$ results = $ client -> runRawQuery ( $ gql );