Laravel5.6如何不通过__construct()为控制器单个方法分配中间件
解决Laravel 5.6中为单个控制器方法分配中间件(无需__construct)的问题
嘿,我明白你的困扰了!你在控制器方法内部调用$this->middleware('permissions')没生效,其实是因为Laravel的中间件执行流程是在控制器方法运行之前就完成的——等你进入index方法的时候,中间件管道已经跑完了,这个时候注册中间件根本赶不上趟儿。而__construct里能生效,是因为控制器构造函数会在中间件管道启动前执行,注册的中间件会被加入到执行队列里。
下面给你两个可行的解决方案:
方案1:在路由文件中直接绑定中间件(推荐)
这是最直接且符合Laravel设计思路的方式,你可以在定义对应路由时,直接给它加上permissions中间件:
基础路由示例
// routes/web.php 或者 routes/api.php Route::get('/your-path', 'YourController@index')->middleware('permissions');
资源路由示例
如果你的控制器是资源控制器,只想给index方法加中间件,可以这么写:
// 先注册其他不需要中间件的资源路由 Route::resource('your-resource', 'YourController')->except(['index']); // 单独给index方法的路由绑定中间件 Route::get('/your-resource', 'YourController@index')->middleware('permissions'); // 或者更简洁的写法: Route::resource('your-resource', 'YourController')->only(['index'])->middleware('permissions'); Route::resource('your-resource', 'YourController')->except(['index']);
方案2:利用控制器的路由属性(Laravel 5.6+支持)
如果你更倾向于在控制器里管理中间件,又不想用__construct,可以给控制器添加一个$middleware属性,指定仅对特定方法生效:
class YourController extends Controller { // 定义仅对index方法生效的中间件 protected $middleware = [ 'permissions' => ['only' => ['index']], ]; public function index() { // 你的业务逻辑 } // 其他方法... }
这种方式本质上和在__construct里调用$this->middleware('permissions')->only('index')是一样的,但不需要写构造函数,直接通过类属性配置即可。
这两种方法都能完美解决你的问题,推荐用方案1,因为路由层面的中间件绑定更清晰,便于统一管理路由权限。
内容的提问来源于stack exchange,提问作者Awar Pulldozer
相关产品推荐
相关产品推荐

