Komponen dasar untuk mengintegrasikan Sencha Ext JS Ext.direct ke dalam aplikasi PHP
Pustaka ini menyediakan implementasi sisi server untuk Sencha Ext.direct, komponen komunikasi bergaya RPC yang merupakan bagian dari Ext JS dan Sencha Touch Sencha.
ext direct adalah protokol panggilan prosedur jarak jauh (RPC) platform dan bahasa agnostik. ext direct memungkinkan komunikasi yang lancar antara sisi klien aplikasi Ext JS dan platform server apa pun yang sesuai dengan spesifikasi. ext direct tidak memiliki kewarganegaraan dan ringan, mendukung fitur seperti penemuan API, batching panggilan, dan acara server ke klien.
Saat ini perpustakaan ini hanya digunakan sebagai dasar dari teqneers/ext-direct-bundle, sebuah bundel Symfony yang mengintegrasikan *Ext.direct* ke dalam aplikasi berbasis Symfony. Kami belum mencoba menggunakan perpustakaan sebagai komponen yang berdiri sendiri atau dalam konteks lain selain lingkungan Symfony, jadi berikut ini hanyalah cara kerjanya secara teoritis tanpa bundel. Kami menghargai bantuan dan kontribusi apa pun untuk menjadikan perpustakaan lebih berguna di luar paket.
Anda dapat menginstal perpustakaan ini menggunakan komposer
composer require teqneers/ext-direct
atau tambahkan paket ke file composer.json Anda secara langsung.
Strategi penamaan menentukan bagaimana nama kelas dan namespace PHP diterjemahkan ke dalam nama tindakan Ext.direct yang kompatibel dengan Javascript. Strategi penamaan default menerjemahkan pemisah namspapce menjadi
.
. Jadi MyNamespaceService
diterjemahkan menjadi My.namespace.Service
. Harap dicatat bahwa transformasi harus dapat dibalik ( My.namespace.Service
=> MyNamespaceService
).
$ namingStrategy = new TQ ExtDirect Service DefaultNamingStrategy ();
Registri layanan menggunakan pabrik metadata dari perpustakaan jms/metadata
dan driver anotasi terkait (yang pada gilirannya menggunakan pembaca anotasi doctrine/annotations
) untuk membaca informasi meta tentang kemungkinan kelas layanan yang dianotasi.
$ serviceRegistry = new TQ ExtDirect Service DefaultServiceRegistry (
new Metadata MetadataFactory (
new TQ ExtDirect Metadata Driver AnnotationDriver (
new Doctrine Common Annotations AnnotationReader ()
)
),
$ namingStrategy
);
Registri layanan dapat diisi secara manual dengan memanggil addServices()
atau addService()
atau dengan mengimpor layanan menggunakan TQExtDirectServiceServiceLoader
. Implementasi default TQExtDirectServicePathServiceLoader
dapat membaca kelas dari serangkaian jalur tertentu.
Operator peristiwa bersifat opsional tetapi diharuskan untuk menggunakan fitur seperti konversi dan validasi argumen, konversi hasil dari pemroses pembuatan profil.
$ eventDispatcher = new Symfony Component EventDispatcher EventDispatcher ();
Router digunakan untuk menerjemahkan permintaan Ext.direct yang masuk menjadi panggilan metode PHP ke kelas layanan yang benar. ContainerServiceFactory
mendukung pengambilan layanan dari kontainer injeksi ketergantungan Symfony atau membuat instance layanan sederhana yang tidak memerlukan argumen konstruktor sama sekali. Panggilan layanan statis melewati pabrik layanan.
$ router = new TQ ExtDirect Router Router (
new TQ ExtDirect Router ServiceResolver (
$ serviceRegistry ,
new TQ ExtDirect Service ContainerServiceFactory (
/* a SymfonyComponentDependencyInjectionContainerInterface */
)
),
$ eventDispatcher
);
Objek titik akhir adalah fasad di depan semua komponen sisi server Ext.direct . Dengan metode createServiceDescription()
seseorang dapat memperoleh deskripsi API yang sesuai standar sementara handleRequest()
mengambil SymfonyComponentHttpFoundationRequest
dan mengembalikan SymfonyComponentHttpFoundationResponse
yang berisi respons Ext.direct untuk panggilan layanan diterima.
$ 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 '
)
);
Manajer titik akhir hanyalah kumpulan titik akhir sederhana yang memungkinkan pengambilan menggunakan id titik akhir. Hal ini memungkinkan pemaparan beberapa API independen dengan mudah.
$ 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 ();
Proses perutean dapat dimanipulasi dan ditambah dengan menggunakan pendengar peristiwa pada pengirim peristiwa yang diteruskan ke router. Perpustakaan menyediakan empat pelanggan acara yang mengizinkan
Argumen yang dikirim dan pengonversi hasil menggunakan pustaka jms/serializer
untuk menyediakan kemampuan serialisasi (de-) yang diperluas, sedangkan validator argumen default menggunakan pustaka 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 */
)
);
Layanan yang akan diekspos melalui API Ext.direct harus dilengkapi dengan informasi meta yang sesuai. Saat ini hal ini hanya dapat dilakukan dengan menggunakan anotasi (seperti yang diketahui dari Doctrine, Symfony, atau pustaka PHP modern lainnya).
Setiap kelas layanan yang akan diekspos sebagai tindakan Ext.direct harus dianotasi dengan TQExtDirectAnnotationAction
. Anotasi Action
secara opsional mengambil parameter id layanan untuk layanan yang tidak statis dan tidak dapat dipakai dengan konstruktor tanpa parameter.
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
}
Selain itu, setiap metode yang akan diekspos pada tindakan Ext.direct harus dianotasi dengan TQExtDirectAnnotationMethod
. Anotasi Method
secara opsional menggunakan true
untuk menunjuk metode sebagai pengendali formulir (mengambil postingan formulir reguler) atau false
untuk menunjuk metode sebagai metode Ext.direct biasa (ini adalah default).
/**
* @DirectAction("app.direct.service3")
*/
class Service3
{
/**
* @DirectMethod()
*/
public function methodA ()
{
// regular method
}
/**
* @DirectMethod(true)
*/
public function methodB ()
{
// form handler method
}
}
Fitur yang diperluas seperti parameter bernama dan parameter bernama ketat yang dijelaskan dalam spesifikasi Ext.direct saat ini tidak diekspos melalui sistem anotasi.
Parameter yang masuk ke metode yang dipanggil melalui permintaan Ext.direct juga dapat diberi anotasi untuk menerapkan validasi parameter. Hal ini mengharuskan TQExtDirectRouterEventListenerArgumentValidationListener
didaftarkan pada operator kejadian yang sesuai.
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 )
{
}
}
Jika tanda tangan dari metode yang dipanggil memperlihatkan parameter dengan petunjuk tipe untuk SymfonyComponentHttpFoundationRequest
dan/atau TQExtDirectRouterRequest
, permintaan HTTP Symfony yang masuk dan/atau Ext.direct mentah permintaan dimasukkan ke dalam pemanggilan metode secara otomatis. Ini adalah metode penanganan formulir yang sangat penting karena tidak ada cara lain untuk mengakses parameter permintaan HTTP yang masuk (postingan formulir).
Segera setelah TQExtDirectRouterEventListenerArgumentConversionListener
diaktifkan, seseorang dapat menggunakan parameter objek yang diketik secara ketat pada metode layanan. Argumen ini akan secara otomatis dideserialisasi dari permintaan JSON yang masuk dan akan dimasukkan ke dalam pemanggilan metode.
Hal yang sama berlaku untuk mengembalikan objek dari panggilan metode layanan. Jika TQExtDirectRouterEventListenerResultConversionListener
diaktifkan, nilai yang dikembalikan secara otomatis diserialkan ke JSON meskipun itu adalah objek yang tidak sepele.
Baik argumen maupun konversi nilai kembalian didasarkan pada perpustakaan jms/serializer
yang sangat baik oleh Johannes Schmitt. Lihat dokumentasi untuk informasi lebih lanjut.
Spesifikasi ext direct dapat ditemukan di situs dokumentasi Sencha.
Lisensi MIT (MIT)
Hak Cipta (c) 2015 TEQneers GmbH & Co.KG
Izin dengan ini diberikan, secara gratis, kepada siapa pun yang memperoleh salinan perangkat lunak ini dan file dokumentasi terkait ("Perangkat Lunak"), untuk menggunakan Perangkat Lunak tanpa batasan, termasuk tanpa batasan hak untuk menggunakan, menyalin, memodifikasi, menggabungkan , mempublikasikan, mendistribusikan, mensublisensikan, dan/atau menjual salinan Perangkat Lunak, dan mengizinkan orang yang menerima Perangkat Lunak untuk melakukan hal tersebut, dengan tunduk pada ketentuan berikut:
Pemberitahuan hak cipta di atas dan pemberitahuan izin ini akan disertakan dalam semua salinan atau sebagian besar Perangkat Lunak.
PERANGKAT LUNAK INI DISEDIAKAN "APA ADANYA", TANPA JAMINAN APA PUN, TERSURAT MAUPUN TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN KELAYAKAN UNTUK DIPERDAGANGKAN, KESESUAIAN UNTUK TUJUAN TERTENTU, DAN TIDAK ADA PELANGGARAN. DALAM KEADAAN APA PUN PENULIS ATAU PEMEGANG HAK CIPTA TIDAK BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN, ATAU TANGGUNG JAWAB LAINNYA, BAIK DALAM TINDAKAN KONTRAK, HUKUM ATAU LAINNYA, YANG TIMBUL DARI, ATAU SEHUBUNGAN DENGAN PERANGKAT LUNAK ATAU PENGGUNAAN ATAU HAL-HAL LAIN DALAM PERANGKAT LUNAK.