將 Sencha Ext JS Ext.direct 整合到 PHP 應用程式中的基本元件
該函式庫為 Sencha Ext.direct提供伺服器端實現,這是一個 RPC 風格的通訊元件,是 Sencha 的Ext JS和Sencha Touch的一部分。
ext direct是一種與平台和語言無關的遠端過程呼叫 (RPC) 協定。 ext direct可讓 Ext JS 應用程式的用戶端與任何符合規範的伺服器平台之間進行無縫通訊。 ext direct是無狀態且輕量級的,支援 API 發現、呼叫批次和伺服器到客戶端事件等功能。
目前,該程式庫僅用作 teqneers/ext-direct-bundle 的基礎,teqneers/ext-direct-bundle 是一個將 * Ext.direct* 整合到基於 Symfony 的應用程式中的 Symfony 套件。我們沒有嘗試將該庫用作獨立組件或在除 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
並傳回SymfonyComponentHttpFoundationResponse
,其中包含服務呼叫的Ext.direct回應已收到。
$ 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 ();
可以透過使用傳遞到路由器的事件調度程式上的事件偵聽器來操縱和增強路由過程。該庫提供了四個事件訂閱者,允許
附帶的參數和結果轉換器使用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
將方法指定為表單處理程序(採用常規表單貼文),或採用false
將方法指定為常規Ext.direct方法(這是預設值)。
/**
* @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請求會自動注入到方法調用中。這對於 form 表單處理方法尤其重要,因為沒有其他方法可以存取傳入的 HTTP 請求參數(表單 post)。
一旦啟用TQExtDirectRouterEventListenerArgumentConversionListener
,就可以在服務方法上使用嚴格類型的物件參數。這些參數將自動從傳入的 JSON 請求中反序列化,並注入到方法呼叫中。
從服務方法呼叫返回物件也是如此。如果啟用TQExtDirectRouterEventListenerResultConversionListener
,則傳回值會自動序列化為 JSON,即使它們是重要物件。
參數和回傳值轉換都基於 Johannes Schmitt 優秀的jms/serializer
函式庫。請參閱文件以取得更多資訊。
ext direct規格可以在 Sencha 的文件網站上找到。
麻省理工學院許可證 (MIT)
版權所有 (c) 2015 TEQneers GmbH & Co. KG
特此免費授予任何獲得本軟體和相關文件文件(「軟體」)副本的人不受限制地使用本軟體,包括但不限於使用、複製、修改、合併的權利、發布、分發、再授權和/或銷售軟體的副本,並允許向其提供軟體的人員這樣做,但須滿足以下條件:
上述版權聲明和本授權聲明應包含在本軟體的所有副本或主要部分中。
本軟體以「現況」提供,不提供任何明示或暗示的保證,包括但不限於適銷性、特定用途的適用性和不侵權的保證。 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE軟體.