องค์ประกอบพื้นฐานในการรวม Sencha Ext JS Ext.direct เข้ากับแอปพลิเคชัน PHP
ไลบรารีนี้จัดเตรียมการใช้งานฝั่งเซิร์ฟเวอร์สำหรับ Sencha Ext.direct ซึ่งเป็นส่วนประกอบการสื่อสารสไตล์ RPC ซึ่งเป็นส่วนหนึ่งของ Ext JS และ Sencha Touch ของ Sencha
ext direct เป็นแพลตฟอร์มและโปรโตคอลการเรียกขั้นตอนระยะไกลที่ไม่เชื่อเรื่องพระเจ้า (RPC) ext direct ช่วยให้สามารถสื่อสารได้อย่างราบรื่นระหว่างฝั่งไคลเอ็นต์ของแอปพลิเคชัน Ext JS และแพลตฟอร์มเซิร์ฟเวอร์ใดๆ ที่สอดคล้องกับข้อกำหนด ext direct เป็นแบบไม่เก็บสถานะและมีขนาดเล็ก รองรับฟีเจอร์ต่างๆ เช่น การค้นพบ API, การโทรเป็นชุด และเหตุการณ์เซิร์ฟเวอร์ไปยังไคลเอนต์
ปัจจุบันไลบรารีนี้ใช้เป็นรากฐานของ teqneers/ext-direct-bundle เท่านั้น ซึ่งเป็นชุด Symfony ที่รวม * Ext.direct* เข้ากับแอปพลิเคชันที่ใช้ Symfony เราไม่ได้พยายามใช้ไลบรารีเป็นส่วนประกอบแบบสแตนด์อโลนหรือในบริบทอื่นใดนอกเหนือจากสภาพแวดล้อม Symfony ดังนั้นต่อไปนี้เป็นเพียงวิธีการทำงานตามทฤษฎีโดยไม่ต้องใช้บันเดิลเท่านั้น เราขอขอบคุณสำหรับความช่วยเหลือและการสนับสนุนเพื่อทำให้ห้องสมุดมีประโยชน์มากขึ้นนอกเหนือจากชุดรวม
คุณสามารถติดตั้งไลบรารีนี้โดยใช้ผู้แต่ง
composer require teqneers/ext-direct
หรือเพิ่มแพ็กเกจลงในไฟล์ composer.json ของคุณโดยตรง
กลยุทธ์การตั้งชื่อจะกำหนดวิธีการแปลชื่อคลาส PHP และเนมสเปซเป็นชื่อการกระทำ Ext.direct ที่เข้ากันได้กับ Javascript กลยุทธ์การตั้งชื่อเริ่มต้นจะแปลตัวคั่น 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 '
)
);
ตัวจัดการจุดสิ้นสุดเป็นเพียงคอลเลกชันจุดปลายธรรมดาที่อนุญาตให้เรียกข้อมูลโดยใช้รหัสจุดปลาย ซึ่งช่วยให้เปิดเผย 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
เพื่อจัดเตรียมความสามารถในการทำให้ซีเรียลไลซ์แบบขยาย (de-) ในขณะที่ตัวตรวจสอบอาร์กิวเมนต์เริ่มต้นใช้ไลบรารี 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
อาจเลือกใช้พารามิเตอร์รหัสบริการสำหรับบริการที่ไม่คงที่หรือไม่สามารถสร้างอินสแตนซ์ด้วยตัวสร้างที่ไม่มีพารามิเตอร์ได้
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 แบบดิบ คำขอจะถูกฉีดเข้าไปในการเรียกเมธอดโดยอัตโนมัติ นี่เป็นวิธีการจัดการแบบฟอร์มที่สำคัญอย่างยิ่ง เนื่องจากไม่มีวิธีอื่นในการเข้าถึงพารามิเตอร์คำขอ HTTP ขาเข้า (การโพสต์แบบฟอร์ม)
ทันทีที่เปิดใช้งาน TQExtDirectRouterEventListenerArgumentConversionListener
เราสามารถใช้พารามิเตอร์อ็อบเจ็กต์ที่พิมพ์อย่างเคร่งครัดในวิธีการบริการ อาร์กิวเมนต์เหล่านี้จะถูกดีซีเรียลไลซ์โดยอัตโนมัติจากคำขอ JSON ขาเข้า และจะถูกแทรกลงในการเรียกเมธอด
เช่นเดียวกับการส่งคืนอ็อบเจ็กต์จากการเรียกใช้เมธอดบริการ หากเปิดใช้งาน TQExtDirectRouterEventListenerResultConversionListener
ค่าที่ส่งคืนจะถูกทำให้เป็นอนุกรมโดยอัตโนมัติไปยัง JSON แม้ว่าจะเป็นออบเจ็กต์ที่ไม่สำคัญก็ตาม
ทั้งอาร์กิวเมนต์และการแปลงค่าตอบแทนนั้นขึ้นอยู่กับไลบรารี jms/serializer
ที่ยอดเยี่ยมโดย Johannes Schmitt ดูเอกสารประกอบสำหรับข้อมูลเพิ่มเติม
ข้อมูลจำเพาะ ext direct สามารถพบได้บนเว็บไซต์เอกสารประกอบของ Sencha
ใบอนุญาต MIT (MIT)
ลิขสิทธิ์ (c) 2015 TEQneers GmbH & Co. KG
อนุญาตให้บุคคลใดก็ตามที่ได้รับสำเนาของซอฟต์แวร์นี้และไฟล์เอกสารที่เกี่ยวข้อง ("ซอฟต์แวร์") อนุญาตโดยไม่เสียค่าใช้จ่าย เพื่อจัดการกับซอฟต์แวร์โดยไม่มีข้อจำกัด รวมถึงแต่ไม่จำกัดเพียงสิทธิ์ในการใช้ คัดลอก ปรับเปลี่ยน ผสาน เผยแพร่ แจกจ่าย ให้อนุญาตช่วง และ/หรือขายสำเนาของซอฟต์แวร์ และอนุญาตให้บุคคลที่ได้รับซอฟต์แวร์นี้สามารถทำได้ ภายใต้เงื่อนไขต่อไปนี้:
ประกาศเกี่ยวกับลิขสิทธิ์ข้างต้นและประกาศการอนุญาตนี้จะรวมอยู่ในสำเนาทั้งหมดหรือส่วนสำคัญของซอฟต์แวร์
ซอฟต์แวร์นี้มีให้ "ตามที่เป็น" โดยไม่มีการรับประกันใดๆ ทั้งโดยชัดแจ้งหรือโดยนัย ซึ่งรวมถึงแต่ไม่จำกัดเพียงการรับประกันความสามารถในการค้าขาย ความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ และการไม่ละเมิด ไม่ว่าในกรณีใดผู้เขียนหรือผู้ถือลิขสิทธิ์จะต้องรับผิดต่อการเรียกร้องค่าเสียหายหรือความรับผิดอื่นใดไม่ว่าในการกระทำของสัญญาการละเมิดหรืออย่างอื่นที่เกิดขึ้นจากหรือเกี่ยวข้องกับซอฟต์แวร์หรือการใช้งานหรือข้อตกลงอื่น ๆ ใน ซอฟต์แวร์.