Laravel控制器全局规则实现:让Admin验证逻辑覆盖所有方法
Laravel控制器统一规则实现方案(以AdminController为例)
一、用中间件统一处理Admin登录验证
- 创建自定义中间件:
执行命令:php artisan make:middleware AdminAuth - 打开
app/Http/Middleware/AdminAuth.php,写入验证逻辑:public function handle(Request $request, Closure $next) { // 检查Admin会话是否存在,不存在则跳转登录页 if (!session('Admin')) { return redirect('adminpanel/login'); } return $next($request); } - 在
app/Http/Kernel.php的$routeMiddleware数组中注册中间件:'admin.auth' => \App\Http\Middleware\AdminAuth::class, - 在AdminController的构造方法中全局应用该中间件,所有方法自动生效:
class AdminController extends Controller { public function __construct() { $this->middleware('admin.auth'); } // 其他业务方法... }
二、统一共享公共数据到所有视图
解决accinfo和charinfo重复查询的问题,有两种实现方式:
方式1:控制器构造方法内共享
直接在AdminController的构造方法中添加视图共享代码,该控制器下所有视图均可直接使用共享数据:
class AdminController extends Controller { public function __construct() { $this->middleware('admin.auth'); // 一次性查询并共享统计数据 view()->share([ 'accinfo' => DB::Table('MEMB_INFO')->count(), 'charinfo' => DB::Table('Character')->count(), ]); } // 示例方法:直接返回视图,无需重复传参 public function home() { return view('ap.home'); } }
方式2:中间件内共享数据
如果其他控制器也需要这两个统计数据,可将共享逻辑整合到AdminAuth中间件中:
public function handle(Request $request, Closure $next) { if (!session('Admin')) { return redirect('adminpanel/login'); } // 共享数据给所有经过该中间件的视图 view()->share([ 'accinfo' => DB::Table('MEMB_INFO')->count(), 'charinfo' => DB::Table('Character')->count(), ]); return $next($request); }
三、整合后的完整AdminController示例
namespace App\Http\Controllers; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\View; class AdminController extends Controller { public function __construct() { // 全局应用登录验证中间件 $this->middleware('admin.auth'); // 共享公共统计数据 View::share([ 'accinfo' => DB::table('MEMB_INFO')->count(), 'charinfo' => DB::table('Character')->count(), ]); } // 后台首页 public function home() { return view('ap.home'); } // 示例业务方法:用户列表 public function userList() { $users = DB::table('MEMB_INFO')->get(); return view('ap.user-list', ['users' => $users]); // 视图中可直接使用$accinfo和$charinfo变量 } }
此后新增任何方法,都无需重复编写登录验证和数据查询代码,只需专注业务逻辑即可。
内容的提问来源于stack exchange,提问作者Виктор Минчев
相关产品推荐
相关产品推荐

