📅  最后修改于: 2023-12-03 15:02:37.157000             🧑  作者: Mango
Laravel 是一款流行的 PHP Web 框架,其中的中间件是一个非常有用而且灵活的功能。它可以让我们在请求前或请求后对请求进行处理,从而实现很多有用的功能。控制器中间件更是在路由设置之外,提供了一种可复用的代码片段。
本文将介绍 Laravel 控制器中间件的使用,并提供代码示例。
控制器中间件是 Laravel 框架中提供的一种分离可重用性代码的机制。通过控制器中间件,我们可以在控制器方法执行之前或者之后执行一些代码。这些代码可以是功能限制、用户权限、数据过滤、数据验证和操作记录等。
控制器中间件需要在控制器注册实现,在控制器中返回需要中间件策略的方法名称一起声明在路由中。
在 Laravel 中注册中间件,以 AuthenticateMiddleware
为例:
在 app/Http/Middleware
目录中创建中间件类 AuthenticateMiddleware
:
<?php
namespace App\Http\Middleware;
use Closure;
class AuthenticateMiddleware
{
public function handle($request, Closure $next)
{
if (! $request->session()->get('logged_in')) {
return redirect('login');
}
return $next($request);
}
}
在 app/Providers/AppServiceProvider.php
文件的 boot
方法中注册中间件:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
$this->registerMiddleware();
parent::boot();
}
protected function registerMiddleware()
{
Route::middlewareGroup('auth', [
\App\Http\Middleware\AuthenticateMiddleware::class,
]);
}
}
在路由注册中声明中间件:
Route::group(['middleware' => 'auth'], function () {
Route::get('dashboard', 'UserController@dashboard');
Route::get('settings', 'UserController@settings');
Route::post('settings', 'UserController@update');
});
在上述示例中,我们通过注册中间件 AuthenticateMiddleware
实现了控制器中间件,用户在未登录状态下访问需要权限的路由时,会重定向到登录页面。
下面我们来看一个控制器中间件示例。假设我们需要在用户输入时记录操作日志,我们可以通过控制器中间件实现这个功能。
创建控制器 UserController
:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index()
{
return view('users.index');
}
public function store(Request $request)
{
// 存储数据
Log::info('User created: ' . $request->email);
return redirect()->route('users.index');
}
}
在控制器中定义一个 store
方法,它将记录用户创建的操作日志。
创建一个控制器中间件 OperationLoggingMiddleware
:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Log;
class OperationLoggingMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
Log::info('User operation: ' . $request->method() . ' ' . $request->url());
return $response;
}
}
在代码中,我们使用 Log
记录日志,记录用户的请求方式和请求地址。
在 App/Http/Kernel.php
中注册中间件:
protected $routeMiddleware = [
//...
'operation_logging' => \App\Http\Middleware\OperationLoggingMiddleware::class,
//...
];
在路由中声明中间件:
Route::post('users', 'UserController@store')->middleware('operation_logging');
现在,当我们输入数据时,OperationLoggingMiddleware 中间件会在存储数据和重定向到路由之前记录操作日志。
控制器中间件提供了一种可复用的代码片段,可以帮助我们在路由设置之外实现特定功能或者对请求进行处理。通过本文的介绍,希望您能了解并掌握 Laravel 控制器中间件的使用。