Perisian tengah menyediakan mekanisme yang mudah untuk memeriksa dan menapis permintaan HTTP yang masuk ke dalam aplikasi anda. Sebagai contoh, Lithe termasuk perisian tengah yang menyemak sama ada pengguna aplikasi anda disahkan. Jika pengguna tidak disahkan, middleware akan mengubah hala pengguna ke skrin log masuk aplikasi anda. Walau bagaimanapun, jika pengguna disahkan, perisian tengah akan membenarkan permintaan diteruskan dalam aplikasi.
Dalam Lithe, Middleware ialah fungsi yang mempunyai akses kepada objek permintaan ($req), objek respons ($res) dan fungsi $next dalam gelung permintaan-tindak balas aplikasi. Fungsi $next ialah fungsi dalam penghala Lithe yang, apabila dipanggil, melaksanakan middleware di sebelah middleware semasa.
Fungsi perisian tengah menyediakan mekanisme yang mudah untuk memeriksa, menapis dan mengendalikan permintaan HTTP yang memasuki aplikasi anda.
Fungsi perisian tengah boleh melaksanakan tugas berikut:
Jika fungsi middleware semasa tidak menamatkan kitaran permintaan-tindak balas, ia mesti memanggil $next() untuk menghantar kawalan ke fungsi middleware seterusnya. Jika tidak, permintaan akan belum selesai.
Kod berikut menunjukkan elemen panggilan fungsi middleware:
$app->use(function ($req, $res, $next) { $next(); });
Di mana:
- $req: Hujah permintaan HTTP untuk fungsi middleware, dipanggil "$req" mengikut konvensyen.
- $res: Hujah respons HTTP untuk fungsi middleware, dipanggil "$res" mengikut konvensyen.
- $next: Argumen panggil balik untuk fungsi middleware, dipanggil "$next" oleh konvensyen.
Mari kita mulakan dengan contoh middleware ringkas yang dipanggil myLogger. Perisian tengah ini mencetak mesej DILOG setiap kali permintaan melaluinya. Middleware ditakrifkan sebagai fungsi yang diberikan kepada pembolehubah yang dipanggil myLogger:
$myLogger = function ($req, $res, $next) { echo 'LOGGED'; $next(); };
Perhatikan panggilan ke $next() di atas. Memanggil fungsi ini memanggil fungsi middleware seterusnya dalam aplikasi. Fungsi $next() bukan sebahagian daripada PHP atau Lithe, tetapi ia adalah hujah ketiga yang dihantar kepada fungsi middleware. Fungsi $next() boleh mempunyai sebarang nama, tetapi mengikut konvensyen ia sentiasa dipanggil "next". Untuk mengelakkan kekeliruan, sentiasa gunakan konvensyen ini.
Adalah yang terbaik untuk menganggap perisian tengah sebagai satu siri "lapisan" yang mesti dilalui oleh permintaan HTTP sebelum mencapai aplikasi anda. Setiap lapisan boleh memeriksa permintaan malah menolaknya sepenuhnya.
Untuk memuatkan fungsi middleware, anda boleh memanggil kaedah use() kelas LitheApp, menyatakan fungsi middleware yang diingini. Sebagai contoh, kod berikut memuatkan fungsi middleware myLogger sebelum melaksanakan laluan ke laluan akar (/):
$app->use(function ($req, $res, $next) { $next(); });
Setiap kali aplikasi menerima permintaan, ia mencetak mesej "LOGGED".
Tertib pemuatan middleware adalah penting: fungsi middleware yang dimuatkan dahulu juga dilaksanakan terlebih dahulu.
Fungsi middleware myLogger hanya mencetak mesej dan kemudian menghantar permintaan ke fungsi middleware seterusnya pada tindanan dengan memanggil fungsi $next().
Aplikasi Lithe boleh menggunakan jenis middleware berikut:
Ikat perisian tengah peringkat aplikasi kepada contoh objek aplikasi menggunakan kaedah use() dan METHOD(), dengan METHOD ialah kaedah HTTP permintaan yang dikendalikan oleh fungsi middleware (seperti GET, PUT atau POST) dalam huruf kecil.
Contoh ini menunjukkan fungsi perisian tengah tanpa laluan pemasangan. Fungsi ini dilaksanakan setiap kali aplikasi menerima permintaan.
$myLogger = function ($req, $res, $next) { echo 'LOGGED'; $next(); };
Contoh di bawah menunjukkan perisian tengah yang mengendalikan permintaan GET dalam laluan /user/:id.
$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!'); });
Perisian tengah peringkat penghala berfungsi dengan cara yang sama seperti perisian perantara peringkat aplikasi, kecuali ia terikat dengan tika LitheHttpRouter.
$app->use(function ($req, $res, $next) { echo 'Hello World!'; $next(); });
Muat perisian tengah peringkat penghala menggunakan fungsi USE dan METHOD.
Kod contoh berikut menunjukkan sistem middleware menggunakan middleware peringkat penghala:
$app->get('/user/:id', function ($req, $res, $next) { // Se o ID do usuário for '0', passa para o próximo middleware if ($req->param('id') === '0') { return $next(); } // Caso contrário, envia uma resposta específica $res->send('ID não é 0'); }, function ($req, $res) { // Envia uma resposta quando o ID for '0' $res->send('regular'); });
Gunakan perisian tengah pihak ketiga untuk menambah kefungsian pada apl Lithe.
Pasang modul PHP yang diperlukan untuk fungsi yang diingini dan kemudian muatkannya ke dalam aplikasi anda pada peringkat aplikasi atau pada peringkat penghala.
Contoh berikut menggambarkan memuatkan perisian tengah sesi, fungsi LitheMiddlewareSessionsession.
$router = new \Lithe\Http\Router;
Untuk senarai separa fungsi middleware pihak ketiga yang biasa digunakan dengan Lithe, lihat: Third-Party Middleware.
Jika anda memerlukan perisian tengah anda boleh dikonfigurasikan, buat fungsi yang menerima tatasusunan pilihan atau parameter lain, kemudian kembalikan pelaksanaan perisian tengah berdasarkan parameter input.
$app->use(function ($req, $res, $next) { $next(); });
Kini middleware boleh digunakan seperti yang ditunjukkan di bawah.
$myLogger = function ($req, $res, $next) { echo 'LOGGED'; $next(); };
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!