我创建了这个属性来控制我的路由方法的访问级别。
namespace Lrc\Buscrawler\Attribute;
use Attribute;
#[Attribute(Attribute::TARGET_METHOD)]
class RouteAccess
{
protected int $role;
public const PUBLIC = 0;
public const AUTHENTICATED = 1;
public const ADMIN = 2;
public function __construct($role)
{
$this->role = $role;
}
public function canAccess($sessionID)
{
error_log('Yes, you can.');
}
}
这样我可以将其放入我的控制器方法中以指定哪个角色可以访问该路由方法,如下所示:
namespace Lrc\Buscrawler\Controller;
use Lrc\Buscrawler\Attribute\RouteAccess;
class UserController
{
#[RouteAccess(RouteAccess::AUTHENTICATED)]
public function profile()
{
echo '';
}
}
我在解析路由时假装使用 canAccess 方法,这样我就可以检查该会话是否可以访问该路由。我尝试做的方式是这样的:
namespace Lrc\Buscrawler\Service;
use ReflectionMethod;
use Lrc\Buscrawler\Attribute\RouteAccess;
class AccessService
{
public static function canAccess($session, $controller, $method)
{
$con = new $controller();
$refMethod = new ReflectionMethod($con, $method);
$attributeRef = $refMethod->getAttributes(RouteAccess::class)[0];
$attr = $attributeRef->newInstance();
$attr->canAccess($session);
}
}
我在 $attributeRef->newInstance()
处收到
找不到属性类 (0)错误,即使它是使用 use 导入的,并且已通过上一行中
getAttributes(RouteAccess::class)
中对该类的引用
我已经尝试过的事情:
var_dump($attributeRef)
来检查变量的内容,它返回了正确的object(ReflectionAttribute)#23 (0) { }
$attributeRef->getName()
,它正确地返回了我的预期值$attributeRef->getArguments()
,它也给了我一个错误:未找到属性类(0)
#[RouteAccess(RouteAccess::AUTHENTICATED)]
更改为#[RouteAccess(2)]
,可以解决调用$attributeRef->getArguments()
的问题,但不能解决$attributeRef->newInstance()
这是一个拼写错误,文件夹名称不等于为文件定义的命名空间。