32. 控制器中间件

支持为控制器定义中间件,你只需要在你的控制器中定义middleware属性,例如:

<?php
namespace app\controller;
use app\middleware\Auth;
class Index 
{
    protected $middleware = [Auth::class];
    public function index()
    {
        return 'index';
    }
    public function hello()
    {
        return 'hello';
    }
}

当执行index控制器的时候就会调用Auth中间件,一样支持使用完整的命名空间定义。

如果需要设置控制器中间的生效操作,可以如下定义:

<?php
namespace app\index\controller;
class Index 
{
    protected $middleware = [ 
    	Auth::class . ':admin' 	=> ['except' 	=> ['hello'] ],
        'Hello' => ['only' 		=> ['hello'] ],
    ];
    public function index()
    {
        return 'index';
    }
    public function hello()
    {
        return 'hello';
    }
}

中间件传参

如果需要给中间件传参,可以的定义的时候使用

<?php
namespace app\controller;
class Index 
{
    protected $middleware = ['Auth'];
    public function index()
    {
        return 'index';
    }
    public function hello()
    {
        return 'hello';
    }
}

控制器传参

可以通过给请求对象赋值的方式传参给控制器(或者其它地方),例如

<?php
namespace app\http\middleware;
class Hello
{
    public function handle($request, \Closure $next)
    {
        $request->hello = 'ThinkPHP';
  
        return $next($request);
    }
}

然后在控制器的方法里面可以直接使用

public function index(Request $request)
{
	return $request->hello; // ThinkPHP
}
下一节:当前的请求对象由think\Request类负责,该类不需要单独实例化调用,通常使用依赖注入即可。在其它场合则可以使用think\facade\Request静态类操作。

项目里面应该使用app\Request对象,该对象继承了系统的think\Request对象,但可以增加自定义方法或者覆盖已有方法。项目里面已经在provider.php中进行了定义,所以你仍然可以和之前一样直接使用容器和静态代理操作请求对象。