Laravel 8如何实现类似CakePHP App Controller的全局方法与前置过滤器
Laravel 8 全局公共方法与前置过滤器实现方案
1. 所有控制器可访问的全局公共方法定义
对应CakePHP的App Controller逻辑,Laravel 8默认所有业务控制器都继承自app/Http/Controllers/Controller.php基类,直接在该基类中定义公共方法即可,所有子控制器可直接通过$this调用。
示例:
// app/Http/Controllers/Controller.php <?php namespace App\Http\Controllers; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Routing\Controller as BaseController; class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; // 自定义全局公共方法,所有子控制器可调用 public function jsonResponse($data, $code = 200, $msg = 'success') { return response()->json([ 'code' => $code, 'msg' => $msg, 'data' => $data ]); } }
子控制器调用示例:
// 任意继承Controller的业务控制器中 public function index() { $userList = User::all(); return $this->jsonResponse($userList); }
如果需要全项目(非仅控制器)可调用的公共函数,可在app目录下新建Helpers目录编写自定义函数,再通过composer.json的autoload.files配置项注册自动加载即可。
2. 类似CakePHP before_filter的全局前置过滤实现
Laravel 8中对应该功能的是中间件(Middleware),可根据需求选择全局生效或仅控制器层生效:
全局生效(所有请求都执行)
- 第一步:执行artisan命令生成中间件文件:
php artisan make:middleware GlobalBeforeFilter - 第二步:编辑生成的
app/Http/Middleware/GlobalBeforeFilter.php,在handle方法中编写前置逻辑:
public function handle(Request $request, Closure $next) { // 自定义前置校验逻辑,示例:校验登录状态 if (!auth()->check()) { return redirect()->route('login'); } // 校验通过后继续执行后续请求逻辑 return $next($request); }
- 第三步:注册全局中间件:打开
app/Http/Kernel.php,将中间件类添加到$middleware属性数组中即可。
仅控制器层生效(和CakePHP App Controller中写before_filter效果一致)
直接在app/Http/Controllers/Controller.php的构造方法中绑定中间件逻辑,所有继承该基类的控制器都会执行:
// app/Http/Controllers/Controller.php public function __construct() { $this->middleware(function ($request, $next) { // 自定义前置过滤逻辑 if ($request->input('is_test') && !app()->environment('local')) { abort(403, '测试参数仅可在本地环境使用'); } return $next($request); }); }
如果只需要给单个控制器加前置过滤,直接在对应控制器的构造方法中添加上述$this->middleware逻辑即可。
内容的提问来源于stack exchange,提问作者Manivasagan
相关产品推荐
相关产品推荐

