Sencha Ext JS Ext.direct를 PHP 애플리케이션에 통합하기 위한 기본 구성요소
이 라이브러리는 Sencha Ext JS 및 Sencha Touch 의 일부인 RPC 스타일 통신 구성 요소인 Sencha Ext.direct 에 대한 서버측 구현을 제공합니다.
ext direct 는 플랫폼과 언어에 구애받지 않는 RPC(원격 프로시저 호출) 프로토콜입니다. ext direct Ext JS 애플리케이션의 클라이언트 측과 사양을 준수하는 모든 서버 플랫폼 간의 원활한 통신을 허용합니다. ext direct 상태가 없고 가벼우며 API 검색, 호출 일괄 처리, 서버-클라이언트 이벤트와 같은 기능을 지원합니다.
현재 이 라이브러리는 * Ext.direct*를 Symfony 기반 애플리케이션에 통합하는 Symfony 번들인 teqneers/ext-direct-bundle의 기반으로만 사용됩니다. 우리는 라이브러리를 독립 실행형 구성 요소로 사용하거나 Symfony 환경이 아닌 다른 컨텍스트에서 사용하려고 시도한 적이 없으므로 다음은 번들 없이 이론적으로 작동하는 방법일 뿐입니다. 번들 외부에서 라이브러리를 더욱 유용하게 만드는 데 도움과 기여를 해주시면 감사하겠습니다.
Composer를 사용하여 이 라이브러리를 설치할 수 있습니다.
composer require teqneers/ext-direct
또는 작곡가.json 파일에 패키지를 직접 추가하세요.
명명 전략은 PHP 클래스 이름과 네임스페이스가 Javascript 호환 Ext.direct 액션 이름으로 변환되는 방법을 결정합니다. 기본 명명 전략은 namspapce 구분 기호를
.
. 따라서 MyNamespaceService
My.namespace.Service
로 변환됩니다. 변환은 되돌릴 수 있어야 합니다( My.namespace.Service
=> MyNamespaceService
).
$ namingStrategy = new TQ ExtDirect Service DefaultNamingStrategy ();
서비스 레지스트리는 jms/metadata
라이브러리의 메타데이터 팩토리와 관련 주석 드라이버( doctrine/annotations
판독기를 사용함)를 사용하여 가능한 주석이 달린 서비스 클래스에 대한 메타 정보를 읽습니다.
$ serviceRegistry = new TQ ExtDirect Service DefaultServiceRegistry (
new Metadata MetadataFactory (
new TQ ExtDirect Metadata Driver AnnotationDriver (
new Doctrine Common Annotations AnnotationReader ()
)
),
$ namingStrategy
);
서비스 레지스트리는 addServices()
또는 addService()
호출하거나 TQExtDirectServiceServiceLoader
사용하여 서비스를 가져와 수동으로 채울 수 있습니다. 기본 구현 TQExtDirectServicePathServiceLoader
지정된 경로 집합에서 클래스를 읽을 수 있습니다.
이벤트 디스패처는 선택 사항이지만 인수 변환 및 유효성 검사, 프로파일링 리스너의 결과 변환과 같은 기능을 사용하는 데 필요합니다.
$ eventDispatcher = new Symfony Component EventDispatcher EventDispatcher ();
라우터는 들어오는 Ext.direct 요청을 올바른 서비스 클래스에 대한 PHP 메소드 호출로 변환하는 데 사용됩니다. ContainerServiceFactory
Symfony 종속성 주입 컨테이너에서 서비스 검색을 지원하거나 생성자 인수를 전혀 사용하지 않는 간단한 서비스 인스턴스화를 지원합니다. 정적 서비스 호출은 서비스 팩토리를 우회합니다.
$ router = new TQ ExtDirect Router Router (
new TQ ExtDirect Router ServiceResolver (
$ serviceRegistry ,
new TQ ExtDirect Service ContainerServiceFactory (
/* a SymfonyComponentDependencyInjectionContainerInterface */
)
),
$ eventDispatcher
);
엔드포인트 개체는 모든 Ext.direct 서버 측 구성 요소 앞에 있는 외관입니다. createServiceDescription()
메소드를 사용하면 표준 호환 API 설명을 얻을 수 있는 반면, handleRequest()
SymfonyComponentHttpFoundationRequest
가져와 서비스 호출에 대한 Ext.direct 응답이 포함된 SymfonyComponentHttpFoundationResponse
반환합니다. 받았다.
$ endpoint = TQ ExtDirect Service Endpoint (
' default ' , // endpoint id
new TQ ExtDirect Description ServiceDescriptionFactory (
$ serviceRegistry ,
' My.api ' ,
$ router ,
new TQ ExtDirect Router RequestFactory (),
' My.api.REMOTING_API '
)
);
엔드포인트 관리자는 엔드포인트 ID를 사용하여 검색을 허용하는 단순한 엔드포인트 모음입니다. 이를 통해 여러 개의 독립적인 API를 쉽게 노출할 수 있습니다.
$ manager = new TQ ExtDirect Service EndpointManager ();
$ manager -> addEndpoint ( $ endpoint );
$ defaultEndpoint = $ manager -> getEndpoint ( ' default ' );
$ apiResponse = $ defaultEndpoint -> createServiceDescription ( ' /path/to/router ' );
$ apiResponse -> send ();
$ request = Symfony Component HttpFoundation Request:: createFromGlobals ();
$ response = $ defaultEndpoint -> handleRequest ( $ request );
$ response -> send ();
라우팅 프로세스는 라우터에 전달된 이벤트 디스패처의 이벤트 리스너를 사용하여 조작하고 확장할 수 있습니다. 라이브러리는 다음을 허용하는 4개의 이벤트 구독자를 제공합니다.
제공된 인수 및 결과 변환기는 jms/serializer
라이브러리를 사용하여 확장된 (역)직렬화 기능을 제공하는 반면, 기본 인수 유효성 검사기는 symfony/validator
라이브러리를 사용합니다.
$ eventDispatcher -> addSubscriber (
new TQ ExtDirect Router EventListener ArgumentConversionListener (
new TQ ExtDirect Router ArgumentConverter ( /* a JMSSerializerSerializer */ )
)
);
$ eventDispatcher -> addSubscriber (
new TQ ExtDirect Router EventListener ArgumentValidationListener (
new TQ ExtDirect Router ArgumentValidator ( /* a SymfonyComponentValidatorValidatorValidatorInterface */ )
)
);
$ eventDispatcher -> addSubscriber (
new TQ ExtDirect Router EventListener ResultConversionListener (
new TQ ExtDirect Router ResultConverter ( /* a JMSSerializerSerializer */ )
)
);
$ eventDispatcher -> addSubscriber (
new TQ ExtDirect Router EventListener StopwatchListener (
/* a SymfonyComponentStopwatchStopwatch */
)
);
Ext.direct API를 통해 노출되는 서비스는 적절한 메타 정보로 장식되어야 합니다. 현재 이는 주석(예: Doctrine, Symfony 또는 기타 최신 PHP 라이브러리에서 알려진 주석)을 통해서만 가능합니다.
Ext.direct 작업으로 노출될 각 서비스 클래스에는 TQExtDirectAnnotationAction
으로 주석을 달아야 합니다. Action
주석은 정적이지도 않고 매개변수 없는 생성자로 인스턴스화될 수도 없는 서비스에 대해 선택적으로 서비스 ID 매개변수를 사용합니다.
use TQ ExtDirect Annotation as Direct ;
/**
* @DirectAction()
*/
class Service1
{
// service will be instantiated using the parameter-less constructor if called method is not static
}
/**
* @DirectAction("app.direct.service2")
*/
class Service2
{
// service will be retrieved from the dependency injection container using id "app.direct.service2" if called method is not static
}
또한 Ext.direct 작업에 노출되는 각 메서드에는 TQExtDirectAnnotationMethod
주석을 달아야 합니다. Method
주석은 선택적으로 메소드를 양식 핸들러(일반 양식 게시물 사용)로 지정하기 위해 true
사용하거나 메소드를 일반 Ext.direct 메소드(기본값)로 지정하기 위해 false
사용합니다.
/**
* @DirectAction("app.direct.service3")
*/
class Service3
{
/**
* @DirectMethod()
*/
public function methodA ()
{
// regular method
}
/**
* @DirectMethod(true)
*/
public function methodB ()
{
// form handler method
}
}
Ext.direct 사양에 설명된 명명된 매개변수 및 엄격한 명명된 매개변수와 같은 확장 기능은 현재 주석 시스템을 통해 노출되지 않습니다.
Ext.direct 요청을 통해 호출되는 메소드에 들어가는 매개변수에는 매개변수 검증을 적용하기 위해 주석을 달 수도 있습니다. 이를 위해서는 TQExtDirectRouterEventListenerArgumentValidationListener
적절한 이벤트 디스패처에 등록되어 있어야 합니다.
use Symfony Component Validator Constraints as Assert ;
/**
* @DirectAction("app.direct.service4")
*/
class Service4
{
/**
* @DirectMethod()
* @DirectParameter("a", { @AssertNotNull(), @AssertType("int") })
*
* @param int $a
*/
public function methodA ( $ a )
{
}
}
호출되는 메소드의 서명이 SymfonyComponentHttpFoundationRequest
및/또는 TQExtDirectRouterRequest
에 대한 유형 힌트가 있는 매개변수를 노출하는 경우 들어오는 Symfony HTTP 요청 및/또는 원시 Ext.direct 요청은 메소드 호출에 자동으로 주입됩니다. 들어오는 HTTP 요청 매개 변수(양식 게시)에 액세스할 수 있는 다른 방법이 없기 때문에 이는 특히 중요한 양식 처리 방법입니다.
TQExtDirectRouterEventListenerArgumentConversionListener
활성화되자마자 서비스 메서드에서 엄격한 형식의 개체 매개 변수를 사용할 수 있습니다. 이러한 인수는 들어오는 JSON 요청에서 자동으로 역직렬화되어 메서드 호출에 삽입됩니다.
서비스 메서드 호출에서 개체를 반환하는 경우에도 마찬가지입니다. TQExtDirectRouterEventListenerResultConversionListener
활성화된 경우 반환 값은 중요하지 않은 개체인 경우에도 자동으로 JSON으로 직렬화됩니다.
인수와 반환 값 변환 모두 Johannes Schmitt의 뛰어난 jms/serializer
라이브러리를 기반으로 합니다. 자세한 내용은 설명서를 참조하세요.
ext direct 스펙은 Sencha의 문서 웹사이트에서 찾을 수 있습니다.
MIT 라이센스(MIT)
저작권 (c) 2015 TEQneers GmbH & Co. KG
본 소프트웨어 및 관련 문서 파일("소프트웨어")의 사본을 취득한 모든 사람에게 사용, 복사, 수정, 병합에 대한 권리를 포함하되 이에 국한되지 않고 제한 없이 소프트웨어를 취급할 수 있는 권한이 무료로 부여됩니다. , 소프트웨어 사본을 게시, 배포, 재라이센스 부여 및/또는 판매하고, 소프트웨어를 제공받은 사람에게 다음 조건에 따라 그렇게 하도록 허용합니다.
위의 저작권 고지와 본 허가 고지는 소프트웨어의 모든 사본 또는 상당 부분에 포함됩니다.
소프트웨어는 상품성, 특정 목적에의 적합성 및 비침해에 대한 보증을 포함하되 이에 국한되지 않고 명시적이든 묵시적이든 어떠한 종류의 보증 없이 "있는 그대로" 제공됩니다. 어떠한 경우에도 작성자나 저작권 보유자는 계약, 불법 행위 또는 기타 행위로 인해 소프트웨어나 사용 또는 기타 거래와 관련하여 발생하는 모든 청구, 손해 또는 기타 책임에 대해 책임을 지지 않습니다. 소프트웨어.