在 Symfony User Provider 中使用自定义注解
Use custom annotations in Symfony User Provider
我正在尝试制作一个使用自定义 Doctrine 类捆绑包的自定义用户提供程序。这个包使用了实体,就像 Doctrine 一样:
/**
* @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
}
所以我知道注释有效。但是当我在用户提供程序 Class 中使用相同的代码和相同的实体时,我收到以下错误:
[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
}
}
是否可以在该上下文中使用自定义注释?也许我应该做一些特别的事情,以便可以成功加载自定义注释?
提前致谢!
好的,我找到了一个可能不是最好但有效的解决方案。
问题是注释似乎没有使用经典的自动加载,如 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
}
但是,问题在于此方法已弃用,将在 doctrine/annotations 2.0 中删除。
我正在尝试制作一个使用自定义 Doctrine 类捆绑包的自定义用户提供程序。这个包使用了实体,就像 Doctrine 一样:
/**
* @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
}
所以我知道注释有效。但是当我在用户提供程序 Class 中使用相同的代码和相同的实体时,我收到以下错误:
[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
}
}
是否可以在该上下文中使用自定义注释?也许我应该做一些特别的事情,以便可以成功加载自定义注释?
提前致谢!
好的,我找到了一个可能不是最好但有效的解决方案。
问题是注释似乎没有使用经典的自动加载,如 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
}
但是,问题在于此方法已弃用,将在 doctrine/annotations 2.0 中删除。