如何定期禁用Laravel应用?夜间禁用日间恢复方案咨询
Laravel 夜间禁用、日间开放的优雅实现方案
比起你原本计划的在路由里用二进制变量触发全捕获路由,用自定义全局中间件是更贴合Laravel设计思路的优雅解法——它能把访问时间校验的逻辑和路由配置彻底分开,维护起来更省心,复用性也更强。
具体实现步骤
1. 生成自定义中间件
先运行Artisan命令创建中间件:
php artisan make:middleware CheckAccessTime
打开生成的app/Http/Middleware/CheckAccessTime.php,写入时间校验逻辑:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class CheckAccessTime { public function handle(Request $request, Closure $next): Response { // 可以直接写死时段,也可以从配置文件读取(推荐后者,方便随时修改) $startHour = config('app.access_start', 8); $endHour = config('app.access_end', 20); $currentHour = now()->hour; // 不在允许时段的话,返回维护页面或提示信息 if ($currentHour < $startHour || $currentHour >= $endHour) { // 返回自定义夜间关闭页面 return response()->view('maintenance.night', [], 503); // 如果是API接口,可返回JSON:return response()->json(['msg' => '应用夜间已关闭'], 503); } return $next($request); } }
2. 注册中间件
打开app/Http/Kernel.php,把这个中间件加到全局中间件数组里,这样所有请求都会经过校验:
protected $middleware = [ // ... 其他已有的中间件 \App\Http\Middleware\CheckAccessTime::class, ];
要是只想给部分路由生效(比如仅限制web端),就把它加到$middlewareGroups的web组里即可。
3. 配置可修改的时段(可选)
在config/app.php里添加两个配置项,不用改代码就能调整开放时段:
return [ // ... 其他配置内容 'access_start' => env('APP_ACCESS_START', 8), 'access_end' => env('APP_ACCESS_END', 20), ];
然后在.env文件里就能快速修改:
APP_ACCESS_START=8 APP_ACCESS_END=20
4. 创建夜间关闭页面(可选)
在resources/views/maintenance/night.blade.php里写个简单的提示页:
<!DOCTYPE html> <html> <head> <title>应用夜间休息中</title> </head> <body> <h1>抱歉,应用当前处于夜间关闭状态</h1> <p>我们每日8:00-20:00开放访问,感谢您的理解~</p> </body> </html>
为啥这个方案更优?
- 逻辑分离:路由只负责定义路由规则,校验逻辑单独放在中间件,代码结构更清晰
- 灵活度高:想全局生效就全局注册,想只限制部分路由就分组注册,时段改配置就能生效
- 扩展性强:后续要加例外IP、特殊路由白名单,直接在中间件里扩展逻辑即可
- 符合框架习惯:Laravel的中间件就是用来处理这类请求前置校验的,团队成员一看就懂
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

