提问人:kalangaum 提问时间:10/27/2023 最后编辑:kalangaum 更新时间:10/27/2023 访问量:45
尝试从 ReflectionAttribute 获取新实例时找不到 PHP 属性类错误
PHP Attribute Class not found error when trying to get new instance from ReflectionAttribute
问:
我创建了这个属性来控制对路由方法的访问级别。
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);
}
}
我在 上一行中收到一个 Attribute class not found (0) 错误,即使它是随用一起导入的,并且已经传递了上一行中对该类的引用$attributeRef->newInstance()
getAttributes(RouteAccess::class)
我已经尝试过的事情:
- 我已经做了一些检查变量的内容,它返回了我一个正确的
var_dump($attributeRef)
object(ReflectionAttribute)#23 (0) { }
- 我已经尝试过,它正确地返回了我预期值
$attributeRef->getName()
- 我已经尝试过了,它还给了我一个找不到属性类的错误(0)
$attributeRef->getArguments()
- 将属性从 更改为 ,可以解决调用 的问题,但不能解决
#[RouteAccess(RouteAccess::AUTHENTICATED)]
#[RouteAccess(2)]
$attributeRef->getArguments()
$attributeRef->newInstance()
- 将属性从 更改为 ,可以解决调用 的问题,但不能解决
答:
0赞
kalangaum
10/27/2023
#1
这是一个错别字,其中文件夹名称不等于为文件定义的命名空间。
评论
use
include/require/...
use ...\Attribute\RouteAccess;
RouteAccess
namespace