这意味着当用户(Laravel 视图)向服务器(Laravel 控制器)发出请求时,请求将通过中间件。 这样中间件可以检查请求是否经过身份验证:
Laravel 允许你 defi完成并使用附加中间件来执行除身份验证之外的各种任务。
Laravel 中间件,例如身份验证和 CSRF 保护,位于目录中 应用程序/HTTP/中间件 .
因此我们可以说中间件是一个 http 请求过滤器,通过它可以验证条件并执行操作。
要创建一个新的中间件,我们运行以下命令:
php artisan make:middleware <name-of-middleware>
我们创造了 middleware
我们称之为 CheckAge
, artisan
会回答我们如下:
上面的窗口显示中间件已成功创建,名称为“ 检查年龄 “。
查看CheckAge中间件是否创建,进入app/Http/Middleware文件夹下的项目,会看到新建的文件
新建的文件有如下代码
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
}
要使用中间件,我们需要注册它。
Laravel 中有两种类型的中间件:
Middleware globale
Route Middleware
Il 全局中间件 将在来自应用程序的每个 HTTP 请求上执行,而 路由中间件 将被分配到一个特定的路径。 中间件可以注册在 应用程序/Http/Kernel.php。 该文件包含两个属性 $中间件 e $路由中间件 . $中间件属性 用于注册全局中间件和所有权 $路由中间件 用于注册特定于路由的中间件。
要注册全局中间件,请在 $middleware 属性的末尾列出类。
protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
要注册特定于路由的中间件,请将键和值添加到 $routeMiddleware 属性。
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
我们创造了 检查年龄 在前面的例子中。 我们现在可以在中间件路由属性中注册它。 此类注册的代码如下所示。
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'Age' => \App\Http\Middleware\CheckAge::class,
];
我们也可以用中间件传递参数。
例如,如果您的应用程序具有不同的角色,如用户、管理员、超级管理员等。 并且您想根据角色对操作进行身份验证,可以通过使用中间件传递参数来实现。
我们创建的中间件包含以下函数,我们可以在参数后传递自定义参数 $下一步 .
public function handle($request, Closure $next)
{
return $next($request);
}
现在让我们尝试将角色参数设置为我们要从头开始创建的新中间件,然后通过运行以下命令继续创建角色中间件
修改handle方法如下
<?php
namespace App\Http\Middleware;
use Closure;
class RoleMiddleware {
public function handle($request, Closure $next, $role) {
echo "Role: ".$role;
return $next($request);
}
}
我们添加了参数 $role
, 以及方法内部的行 echo
写入输出角色的名称。
现在让我们为特定路径注册 RoleMiddleware 中间件
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'Age' => \App\Http\Middleware\CheckAge::class,
'Role' => \App\Http\Middleware\RoleMiddleware::class,
];
现在要使用参数测试中间件,我们需要创建一个请求和一个响应。 为了模拟响应,让我们创建我们将调用 TestController 的控制器
php artisan make:controller TestController --plain
刚刚执行的命令将在文件夹中创建一个新的控制器 app/Http/TestController.php
, 并改变方法 index
用线 echo "<br>Test Controller.";
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class TestController extends Controller {
public function index() {
echo "<br>Test Controller.";
}
}
设置响应后,我们通过编辑文件来构建请求 routes.php
通过添加 route role
Route::get('role',[
'middleware' => 'Role:editor',
'uses' => 'TestController@index',
]);
此时我们可以通过访问 URL 来尝试示例 http://localhost:8000/role
在浏览器中我们会看到这两个 echo
Role editor
Test Controller
Il terminable Middleware
在响应发送到浏览器后执行一些任务。 这可以通过使用方法创建中间件来实现 终止于中间件。 Il terminable Middleware
必须注册 middleware
全球的。 方法 terminate
将收到两个参数 $ request e $响应。
该方法 Terminate
必须按以下代码所示创建。
php artisan make:middleware TerminateMiddleware
一旦创建了中间件 app/Http/Middleware/TerminateMiddleware.php
让我们修改代码如下
<?php
namespace App\Http\Middleware;
use Closure;
class TerminateMiddleware {
public function handle($request, Closure $next) {
echo "Executing statements of handle method of TerminateMiddleware.";
return $next($request);
}
public function terminate($request, $response) {
echo "<br>Executing statements of terminate method of TerminateMiddleware.";
}
}
在这种情况下,我们有一个方法 handle
和一个方法 terminate
有两个参数 $request
e $response
.
现在让我们注册中间件
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'Age' => \App\Http\Middleware\CheckAge::class,
'Role' => \App\Http\Middleware\RoleMiddleware::class,
'terminate' => \App\Http\Middleware\TerminateMiddleware::class,
];
现在我们需要创建控制器来模拟响应
php artisan make:controller XYZController --plain
修改类的内容
class XYZController extends Controller {
public function index() {
echo "<br>XYZ Controller.";
}
}
现在我们需要编辑文件 routes/web.php
添加激活请求所需的路由
Route::get('terminate',[
'middleware' => 'terminate',
'uses' => 'XYZController@index',
]);
此时我们可以通过访问 URL 来尝试示例 http://localhost:8000/terminate
在浏览器中我们将看到以下几行
Executing statements of handle method of TerminateMiddleware
XYZController
Executing statements of terminate method of TerminateMiddleware
Ercole Palmeri
您还可能感兴趣的: