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
または、パッケージをcomposer.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 のドキュメント Web サイトにあります。
MIT ライセンス (MIT)
著作権 (c) 2015 TEQneers GmbH & Co. KG
本ソフトウェアおよび関連ドキュメント ファイル (以下「ソフトウェア」) のコピーを入手した人には、使用、コピー、変更、マージする権利を含むがこれらに限定されない、制限なくソフトウェアを取り扱う許可が、ここに無償で与えられます。 、以下の条件を条件として、本ソフトウェアのコピーを出版、配布、サブライセンス、および/または販売すること、および本ソフトウェアが提供される人物にそれを許可すること。
上記の著作権表示およびこの許可通知は、ソフトウェアのすべてのコピーまたは主要部分に含まれるものとします。
ソフトウェアは「現状のまま」提供され、明示的か黙示的かを問わず、商品性、特定目的への適合性、および非侵害の保証を含むがこれらに限定されない、いかなる種類の保証も行われません。いかなる場合においても、作者または著作権所有者は、契約行為、不法行為、またはその他の行為であるかどうかにかかわらず、ソフトウェアまたはソフトウェアの使用またはその他の取引に起因または関連して生じる、いかなる請求、損害、またはその他の責任に対しても責任を負わないものとします。ソフトウェア。