代码之家  ›  专栏  ›  技术社区  ›  Arseur

在Symfony用户提供程序中使用自定义注释

  •  1
  • Arseur  · 技术社区  · 7 年前

    我正在尝试创建一个自定义用户提供程序,它使用自定义原则,如捆绑包。这个捆绑包使用实体,很像条令:

    /**
     * @EntityMeta(table="MY_TABLE")
    */
    class MyTable extends AbstractEntity
    {
    /**
     * @var int
     * @EntityColumnMeta(column="Code", isKey=true)
     */
    protected $code;
    
    /**
     * @var int
     * @EntityColumnMeta(column="Name")
     */
    protected $name;
    

    当我使用我的包提供的类似条令的管理器时,这些注释工作得很好。该代码运行良好:

    public function indexAction(DoctrineLikeManager $manager)
    {
        $lines = $manager->getRepository('MyTable')->findBy(array(
            'email' => 'test@test.com'
        ));
        // do something with these
    }
    

    所以我知道注释是有效的。但是,当我在User Provider类中使用相同的代码和相同的实体时,会出现以下错误:

    [Semantical Error] The annotation "@NameSpace\DoctrineLikeBundle\EntityColumnMeta" in property AppBundle\MyTable::$code does not exist, or could not be auto-loaded.
    

    用户提供者:

    class HanaUserProvider implements UserProviderInterface
    {
         private $manager;
    
         public function __construct(DoctrineLikeManager $manager)
         {
             $this->manager = $manager;
         }
    
         public function loadUserByUsername($username)
         {
             // this is where it fails :(
             $lines = $this->manager->getRepository('MyTable')->findBy(array(
        'email' => 'test@test.com'
             ));
             // return user or throw UsernameNotFoundException
         }
    }
    

    在这种情况下可以使用自定义注释吗?也许我应该做一些特别的事情,以便可以成功加载自定义注释?

    提前感谢!

    1 回复  |  直到 7 年前
        1
  •  1
  •   Arseur    7 年前

    好的,我找到了一个解决方案,它可能不是最好的,但很有效。

    正如所解释的那样,问题是注释似乎没有使用经典的自动加载 here .

    我必须在我的用户提供商中注册加载程序:

    public function loadUserByUsername($username)
     {
         AnnotationRegistry::registerLoader('class_exists'); // THIS LINE HERE
         $lines = $this->manager->getRepository('MyTable')->findBy(array(
    'email' => 'test@test.com'
         ));
         // return user or throw UsernameNotFoundException
     }
    

    然而,问题是该方法已被弃用,并将在条令/注释2.0中删除。