转载请著名来源,侵权必究
//属性接口
declare(strict_types=1);
namespace app\common\attribute;
interface AttributeHandler
{
public function handler(mixed $handler);
}
//不需要登陆属性
declare(strict_types=1);
namespace app\common\attribute;
/**
* 跳过登陆验证
*/
#[\Attribute(\Attribute::TARGET_METHOD)]
class NoLogin implements AttributeHandler
{
public function __construct(){
}
public function handler(mixed $handler)
{
// TODO: Implement handler() method.
//return Response::create('页面未找到 - NoLogin', 'html', 404);
}
}
//权限验证属性
declare(strict_types=1);
namespace app\shop\attribute;
use app\common\attribute\AttributeHandler;
/**
* 权限验证
*/
#[\Attribute(\Attribute::TARGET_METHOD)]
class CheckPermission implements AttributeHandler
{
public function __construct(private string $permission){
}
public function handler(mixed $handler)
{
// TODO: Implement handler() method.
//return Response::create('页面未找到 - CheckPermission', 'html', 404);
}
}
注意这里是要加到 控制器中间件
//属性中间件 (控制器中间件)
declare(strict_types=1);
namespace app\common\middleware;
use app\common\attribute\AttributeHandler;
use Closure;
use think\App;
use think\Request;
use think\Response;
use think\Session;
/**
* 属性中间件
*/
class AttributeMiddleware
{
public function __construct(protected App $app, protected Session $session)
{
}
public function handle(Request $request, Closure $next): Response
{
/** @var Response $response */
$response = null;
$reflect = new \ReflectionClass('app\\'.app('http')->getName().'\controller\\'.$request->controller());
$attributes = $reflect->getMethod($request->action())->getAttributes();
foreach($attributes as $attribute){
/**
* @var AttributeHandler $instance
* **/
$instance = $attribute->newInstance();
$response = $instance->handler($this);
if($response instanceof Response){
return $response;
}
}
$request->attributes = $attributes;
$response = $next($request);
return $response;
}
}
//测试类
<?php
namespace app\shop\controller;
use app\common\attribute\NoLogin;
use app\shop\attribute\CheckPermission;
use app\shop\BaseController;
class Index extends BaseController
{
#[CheckPermission(permission:"Foo")]
public function index()
{
return '<style>*{ padding: 0; margin: 0; }</style><iframe src="https://www.thinkphp.cn/welcome?version=' . \think\facade\App::version() . '" width="100%" height="100%" frameborder="0" scrolling="auto"></iframe>';
}
#[NoLogin]
public function hello($name = 'ThinkPHP8')
{
return 'hello,' . $name;
}
}