尝试从 ReflectionAttribute 获取新实例时找不到 PHP 属性类错误

PHP Attribute Class not found error when trying to get new instance from ReflectionAttribute

提问人:kalangaum 提问时间:10/27/2023 最后编辑:kalangaum 更新时间:10/27/2023 访问量:45

问:

我创建了这个属性来控制对路由方法的访问级别。

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()
属性 http-status-code-500 php-8.2

评论

0赞 shingo 10/27/2023
“即使它是随使用一起导入的”不会导入任何内容,您仍然需要语句来导入另一个文件。useinclude/require/...
0赞 kalangaum 10/27/2023
@shingo 它全部处于自动加载 PSR4 状态,并且命名空间正确
0赞 Chris Haas 10/27/2023
很抱歉问,但我很清楚,当你说,你是为了把代码放在这个网站上而编辑的,这不是你的文字代码,对吧?use ...\Attribute\RouteAccess;
0赞 Chris Haas 10/27/2023
但是,显示的代码也不包括,您能确保发布它吗?RouteAccessnamespace
0赞 kalangaum 10/27/2023
@ChrisHaas,在文本中更新,使用了完整的命名空间

答:

0赞 kalangaum 10/27/2023 #1

这是一个错别字,其中文件夹名称不等于为文件定义的命名空间。