Middleware menyediakan mekanisme yang mudah untuk memeriksa dan menapis permintaan HTTP yang memasuki aplikasi anda. Contohnya, Lithe termasuk middleware yang menyemak sama ada pengguna disahkan. Jika tidak, perisian tengah akan mengubah hala pengguna ke skrin log masuk. Jika pengguna disahkan, middleware membenarkan permintaan diteruskan.
Dalam Lithe, middleware ialah fungsi dengan akses kepada objek permintaan ($req), objek respons ($res), dan fungsi $next dalam kitaran permintaan-tindak balas aplikasi. Fungsi $next, apabila dipanggil, memanggil middleware seterusnya dalam tindanan semasa.
Fungsi perisian tengah menyediakan cara yang mudah untuk memeriksa, menapis dan memanipulasi permintaan HTTP masuk ke aplikasi anda. Mereka boleh:
Jika middleware semasa tidak menamatkan kitaran permintaan-tindak balas, ia mesti memanggil $next() untuk menghantar kawalan kepada middleware seterusnya. Jika tidak, permintaan akan kekal belum selesai.
Kod berikut menunjukkan unsur-unsur fungsi middleware:
$app->use(function ($req, $res, $next) { $next(); });
Di mana:
Berikut ialah contoh ringkas perisian tengah yang dipanggil myLogger. Perisian tengah ini mencetak mesej DILOG setiap kali permintaan melaluinya. Ia ditakrifkan sebagai fungsi yang diberikan kepada pembolehubah yang dipanggil myLogger:
$myLogger = function ($req, $res, $next) { echo 'LOGGED'; $next(); };
Perhatikan panggilan $next() di atas. Fungsi ini memanggil middleware seterusnya dalam aplikasi. $next() bukan fungsi PHP atau Lithe terbina dalam tetapi merupakan hujah ketiga yang dihantar kepada fungsi middleware. Walaupun $next() boleh dinamakan apa-apa, mengikut konvensyen, ia sentiasa dipanggil "seterusnya." Untuk mengelakkan kekeliruan, ikuti konvensyen ini.
Bayangkan perisian tengah sebagai satu siri "lapisan" yang dilalui oleh permintaan HTTP sebelum mencapai aplikasi anda. Setiap lapisan boleh memeriksa atau menolak permintaan.
Untuk memuatkan perisian tengah, anda memanggil kaedah use() kelas LitheApp, menyatakan fungsi perisian tengah. Contohnya:
$app = new \Lithe\App; $myLogger = function ($req, $res, $next) { echo 'LOGGED'; $next(); }; $app->use($myLogger); $app->get('/', function ($req, $res, $next) { $res->send('Hello World!'); });
Apabila apl menerima permintaan, mesej "LOGGED" akan dicetak. Urutan pemuatan perisian tengah adalah penting: yang dimuatkan dahulu dilaksanakan dahulu.
Middleware myLogger hanya mencetak mesej, kemudian menghantar permintaan ke middleware seterusnya menggunakan $next().
Aplikasi Lithe boleh menggunakan jenis middleware berikut:
Anda melampirkan perisian tengah peringkat aplikasi pada contoh aplikasi menggunakan kaedah use() atau METHOD(), dengan METHOD merujuk kepada kaedah HTTP (cth., GET, PUT, POST) dalam huruf kecil.
Contoh ini menunjukkan perisian tengah tanpa laluan. Perisian tengah berjalan setiap kali permintaan diterima:
$app->use(function ($req, $res, $next) { $next(); });
Dalam contoh di bawah, middleware mengendalikan permintaan GET ke laluan /user/:id:
$myLogger = function ($req, $res, $next) { echo 'LOGGED'; $next(); };
Perisian tengah peringkat penghala berfungsi seperti perisian perantara peringkat aplikasi tetapi dilampirkan pada tika LitheHttpRouter:
$app = new \Lithe\App; $myLogger = function ($req, $res, $next) { echo 'LOGGED'; $next(); }; $app->use($myLogger); $app->get('/', function ($req, $res, $next) { $res->send('Hello World!'); });
Anda memuatkan middleware peringkat penghala menggunakan fungsi use() dan METHOD().
Berikut ialah contoh perisian tengah peringkat penghala:
$app->use(function ($req, $res, $next) { echo 'Hello World!'; $next(); });
Anda boleh menggunakan perisian tengah pihak ketiga untuk menambah kefungsian pada aplikasi Lithe anda. Pasang modul PHP yang diperlukan dan kemudian muatkannya pada peringkat aplikasi atau penghala.
Berikut ialah contoh perisian tengah sesi memuatkan dengan LitheMiddlewareSessionsession:
$app->get('/user/:id', function ($req, $res, $next) { if ($req->param('id') === '0') { return $next(); } $res->send('ID is not 0'); }, function ($req, $res) { $res->send('regular'); });
Untuk senarai perisian tengah pihak ketiga yang biasa digunakan dengan Lithe, semak sumber Perisian Tengah pihak ketiga.
Jika anda memerlukan perisian tengah anda boleh dikonfigurasikan, anda boleh mencipta fungsi yang menerima tatasusunan pilihan atau parameter lain dan kemudian mengembalikan pelaksanaan perisian tengah berdasarkan parameter tersebut. Lihat contoh di bawah:
$router = new \Lithe\Http\Router;
Kini, anda boleh menggunakan perisian tengah dengan konfigurasi tersuai:
$router = new \Lithe\Http\Router; $router->use(function ($req, $res, $next) { echo 'Time: ', Date('H:i:s'), '<br>'; $next(); }); $router->get('/user/:id', function ($req, $res, $next) { if ($req->param('id') === '0') { $res->redirect('/'); } $next(); }, function ($req, $res) { echo $req->param('id'); $res->render('special'); }); $app->use('/api', $router);
Untuk mencipta middleware yang boleh dipasang oleh pembangun lain melalui Composer, terdapat pakej yang dipanggil lithemod/flow. Ia menyediakan antara muka dan utiliti untuk mengendalikan permintaan dan tindak balas HTTP dalam Lithe, yang memudahkan penciptaan middleware terpiawai dan sedia untuk digunakan merentas pelbagai aplikasi.
lithemod/flow membantu membina middleware yang mantap dengan menyediakan antara muka bersatu untuk Permintaan dan Respons, menjadikan pembangunan lebih cekap dan teratur. Ini memudahkan penyepaduan perisian tengah anda ke dalam projek lain dan memastikan kod itu mengikut piawaian yang konsisten.
Atas ialah kandungan terperinci Middleware dalam Lithe: Cara Ia Berfungsi dan Cara Mencipta Sendiri. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!