Rumah > Artikel > pembangunan bahagian belakang > Kuasai asas perisian tengah Laravel
Dalam artikel ini, kami akan menyelami rangka kerja Laravel secara mendalam untuk memahami konsep perisian tengah. Separuh pertama artikel ini bermula dengan pengenalan kepada perisian tengah dan kegunaan praktikalnya.
Sementara kami meneruskan, kami akan membincangkan cara mencipta perisian tengah tersuai dalam aplikasi Laravel. Sebaik sahaja kami telah mencipta perisian tengah tersuai kami, kami akan meneroka pilihan yang tersedia untuk mendaftarkannya dengan Laravel supaya ia sebenarnya boleh dipanggil semasa aliran pengendalian permintaan.
Saya harap anda menganggap diri anda biasa dengan konsep asas Laravel dan alat baris arahan Artisan untuk menjana kod perancah. Sudah tentu, pemasangan aplikasi Laravel terkini yang berfungsi membolehkan anda menjalankan contoh yang disediakan dalam artikel ini dengan segera.
Kita boleh menganggap perisian tengah sebagai mekanisme yang membolehkan anda menyambung ke aliran pengendalian permintaan biasa aplikasi Laravel. Pemprosesan laluan Laravel biasa melalui peringkat pemprosesan permintaan tertentu, dan perisian tengah ialah salah satu lapisan yang mesti dilalui oleh aplikasi.
Jadi apa gunanya menyambung proses pemprosesan permintaan Laravel? Fikirkan perkara yang perlu dilakukan pada peringkat awal but aplikasi. Sebagai contoh, pengguna perlu disahkan awal untuk memutuskan sama ada mereka dibenarkan untuk mengakses laluan semasa.
Beberapa perkara yang saya boleh fikirkan yang boleh dicapai melalui perisian tengah ialah:
Malah, aplikasi Laravel lalai sudah disertakan dengan beberapa perisian tengah yang penting. Sebagai contoh, terdapat perisian tengah yang menyemak sama ada tapak berada dalam mod penyelenggaraan. Sebaliknya, terdapat perisian tengah untuk membersihkan parameter permintaan input. Seperti yang saya nyatakan sebelum ini, pengesahan pengguna juga dilaksanakan melalui perisian tengah itu sendiri.
Saya harap penjelasan setakat ini telah membantu anda berasa lebih yakin tentang istilah middleware. Jika anda masih keliru, jangan risau kerana kami akan mula membina perisian tengah tersuai di bahagian seterusnya, yang akan membantu anda memahami dengan tepat cara menggunakan perisian tengah di dunia nyata.
Dalam bahagian ini, kami akan mencipta perisian tengah tersuai. Tetapi apakah sebenarnya middleware tersuai kami sepatutnya dicapai?
Baru-baru ini, saya menemui keperluan tersuai daripada pelanggan bahawa jika pengguna mengakses tapak web daripada mana-mana peranti mudah alih, mereka harus diubah hala ke URL subdomain yang sepadan dengan semua parameter rentetan pertanyaan kekal tidak berubah. Saya percaya ini adalah kes penggunaan yang sempurna untuk menunjukkan cara menggunakan perisian tengah Laravel dalam senario khusus ini.
Sebab kami ingin menggunakan perisian tengah dalam kes ini ialah kami perlu menyambung ke aliran permintaan aplikasi. Dalam perisian tengah tersuai kami, kami akan menyemak ejen pengguna dan jika pengguna menggunakan peranti mudah alih, mereka akan diubah hala ke URL mudah alih yang sesuai.
Selepas membincangkan semua teori, mari kita mulakan perkembangan sebenar, ini adalah cara terbaik untuk memahami konsep baru, bukan?
Sebagai pembangun Laravel, jika anda ingin mencipta sebarang fungsi tersuai, anda akan menggunakan alat Artisan pada kebanyakan masa untuk mencipta kod templat asas. Mari gunakannya untuk mencipta kod templat asas untuk perisian tengah tersuai kami.
Pergi ke baris arahan dan pergi ke akar dokumen projek anda. Jalankan arahan berikut untuk mencipta templat perisian tengah tersuai MobileRedirect
. MobileRedirect
。
php artisan make:middleware MobileRedirect
这应该使用以下代码创建一个文件 app/Http/Middleware/MobileRedirect.php
。
<?php namespace App\Http\Middleware; use Closure; class MobileRedirect { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { return $next($request); } }
您通常会注意到 handle
方法的实现,该方法充当中间件的主干,并且您要实现的中间件的主要逻辑应该位于此处.
借此机会介绍一下Laravel自带的中间件类型。主要有前中间件和后中间件两种。
顾名思义,before 中间件是在实际处理请求和构建响应之前运行的中间件。另一方面,后中间件在应用程序处理请求之后运行,并且此时已经构建了响应。
在我们的例子中,我们需要在处理请求之前重定向用户,因此它将被开发为前置中间件。
继续并使用以下内容修改文件 app/Http/Middleware/MobileRedirect.php
。
<?php namespace App\Http\Middleware; use Closure; class MobileRedirect { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { // check if the request is from mobile device if ($request->mobile == "1") { return redirect('mobile-site-url-goes-here'); } return $next($request); } }
为了简单起见,我们只检查 mobile
查询字符串参数是否存在,如果将其设置为 TRUE
,则用户将被重定向到相应的移动设备站点网址。当然,如果您希望实时检测,您会希望使用用户代理检测库。
此外,您还希望将 mobile-site-url-goes-here
<?php namespace App\Http\Middleware; use Closure; class CustomMiddleWare { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $response = $next($request); /* your custom logic goes here */ return $response; } }Ini sepatutnya membuat fail dengan kod berikut
app/Http/Middleware/MobileRedirect.php
. #🎜🎜#
/** * The application's global HTTP middleware stack. * * These middleware are run during every request to your application. * * @var array */ protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, ];#🎜🎜#Anda biasanya akan melihat pelaksanaan kaedah
handle
, yang bertindak sebagai tulang belakang middleware, dan logik utama middleware yang anda ingin laksanakan harus terletak di sini.# 🎜🎜#
#🎜🎜# Ambil peluang ini untuk memperkenalkan jenis perisian tengah yang disertakan dengan Laravel. Terdapat dua jenis utama: perisian tengah hadapan dan perisian pasca pertengahan. #🎜🎜#
#🎜🎜# Seperti namanya, sebelum middleware ialah middleware yang berjalan sebelum permintaan sebenarnya diproses dan respons dibina. Post-middleware, sebaliknya, berjalan selepas permintaan telah diproses oleh aplikasi dan respons telah dibina pada masa ini. #🎜🎜#
#🎜🎜#Dalam kes kami, kami perlu mengubah hala pengguna sebelum memproses permintaan, jadi ia akan dibangunkan sebagai pra-pertengahan. #🎜🎜#
#🎜🎜#Teruskan dan ubah suai fail app/Http/Middleware/MobileRedirect.php
dengan kandungan berikut. #🎜🎜#
protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, \App\Http\Middleware\MobileRedirect::class, ];#🎜🎜#Untuk memudahkan, kami hanya menyemak sama ada parameter rentetan pertanyaan
mobile
Jika ia ditetapkan kepada TRUE
, The pengguna akan diubah hala ke URL tapak peranti mudah alih yang sesuai. Sudah tentu, jika anda mahukan pengesanan masa nyata, anda perlu menggunakan perpustakaan pengesanan ejen pengguna. #🎜🎜#
#🎜🎜# Selain itu, anda perlu menggantikan laluan mobile-site-url-goes-here
dengan laluan atau URL yang betul kerana ia hanyalah pemegang tempat untuk simbol tujuan demonstrasi . #🎜🎜#
按照我们的自定义逻辑,调用 $next($request)
允许在应用程序链中进一步处理请求。在我们的例子中需要注意的重要一点是,我们将移动检测逻辑放置在 $next($request)
调用之前,有效地使其成为一个 before 中间件。
这样,我们的自定义中间件就几乎准备好进行测试了。目前,Laravel 无法了解我们的中间件。为此,您需要向 Laravel 应用程序注册您的中间件,这正是我们下一节的主题。
在进入下一部分之前,我想演示一下后中间件的外观,以防万一有人对此感到好奇。
<?php namespace App\Http\Middleware; use Closure; class CustomMiddleWare { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $response = $next($request); /* your custom logic goes here */ return $response; } }
正如您已经注意到的,中间件的自定义逻辑在 Laravel 应用程序处理请求后执行。此时,您还可以访问 $response
对象,如果您愿意,它允许您操作它的某些方面。
这就是 after 中间件的故事。
本节描述了向 Laravel 应用程序注册中间件的过程,以便在请求处理流程中实际调用它。
继续打开文件 app/Http/Kernel.php
并查找以下代码片段。
/** * The application's global HTTP middleware stack. * * These middleware are run during every request to your application. * * @var array */ protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, ];
如您所见,$middleware
保存了 Laravel 默认安装附带的中间件数组。此处列出的中间件将根据每个 Laravel 请求执行,因此它是放置我们自己的自定义中间件的理想选择。
继续添加我们的自定义中间件,如以下代码片段所示。
protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, \App\Http\Middleware\MobileRedirect::class, ];
现在,尝试使用查询字符串 mobile=1
访问任何 Laravel 路由,这应该会触发我们的中间件代码!
这就是您应该注册需要在每个请求上运行的中间件的方式。但是,有时您希望仅针对特定路由运行中间件。让我们检查一下如何使用 $routeMiddleware
来实现这一点。
在我们当前示例的上下文中,我们假设如果用户访问您网站上的任何特定路由,他们将被重定向到移动网站。在这种情况下,您不想将中间件包含在 $middleware
列表中。
相反,您希望将中间件直接附加到路由定义,如下所示。
Route::get('/hello-world', 'HelloWorldController@index')->middleware(\App\Http\Middleware\MobileRedirect::class);
事实上,我们可以更进一步,为我们的中间件创建一个别名,这样您就不必使用内联类名。
打开文件 app/Http/Kernel.php
并查找 $routeMiddleware
,它保存了别名到中间件的映射。让我们将我们的条目包含到该列表中,如以下代码片段所示。
protected $routeMiddleware = [ 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'mobile.redirect' => \App\Http\Middleware\MobileRedirect::class ];
修改后的路由定义如下所示。
Route::get('/hello-world', 'HelloWorldController@index')->middleware('mobile.redirect');
这就是向 Laravel 应用程序注册中间件的故事。这非常简单,不是吗?
事实上,我们已经读到了本文的结尾,我希望您能充分享受它。
探索任何框架中的架构概念总是令人兴奋的事情,这就是我们在本文中探索 Laravel 框架中的中间件时所做的事情。
从中间件的基本介绍开始,我们将注意力转移到在 Laravel 应用程序中创建自定义中间件的主题。文章的后半部分讨论了如何向 Laravel 注册自定义中间件,这也是探索附加中间件的不同方式的机会。
希望这次旅程富有成效,并且本文能够帮助您丰富您的知识。另外,如果您希望我在即将发表的文章中提出特定主题,您可以随时给我留言。
今天就这样,如果有任何疑问,请随时使用下面的提要来提出您的疑问!
Atas ialah kandungan terperinci Kuasai asas perisian tengah Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!