我使用的是基于Symfony 5的Bolt 4 CMS。在我编写的控制器中,我想列出数据库中的所有用户,检索他们的电子邮件地址并向他们发送电子邮件。现在我只是想从用户名中检索电子邮件地址。
在这个示例https://symfony.com/doc/current/security/user_provider.html中,它告诉您如何创建自己的类来处理来自数据库的用户:
// src/Repository/UserRepository.php
namespace AppRepository;
use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use SymfonyBridgeDoctrineSecurityUserUserLoaderInterface;
class UserRepository extends ServiceEntityRepository implements UserLoaderInterface
{
// ...
public function loadUserByUsername(string $usernameOrEmail)
{
$entityManager = $this->getEntityManager();
return $entityManager->createQuery(
'SELECT u
FROM AppEntityUser u
WHERE u.username = :query
OR u.email = :query'
)
->setParameter('query', $usernameOrEmail)
->getOneOrNullResult();
}
}
在我的自定义控制器中,我调用这个类和函数:
// src/Controller/LalalanEventController.php
namespace AppController;
use SymfonyComponentMailerMailerInterface;
use SymfonyComponentMimeEmail;
use AppRepositoryLalalanUserManager;
class LalalanEventController extends AbstractController
{
/**
* @Route("/new_event_email")
*/
private function sendEmail(MailerInterface $mailer)
{
$userManager = new LalalanUserManager();
$email = (new Email())
->from('aaa.bbb@ccc.com')
->to($userManager('nullname')->email)
->subject('Nice title')
->text('Sending emails is fun again!')
->html('<p>See Twig integration for better HTML integration!</p>');
$mailer->send($email);
}
}
不幸的是,在这个例子中,这个类是从ServiceEntityRepository
扩展而来的,它需要一个ManagerRegistry
作为构造函数。有人知道我该怎么做才能解决这个问题吗?
提前感谢!
正如文档中所说,
用户提供程序是与Symfony相关的PHP类Security有两个任务:
- 从会话中重新加载用户
- 为某些功能加载用户
所以如果你只想获得用户列表,你只需要像这样获得UserRepository
:
/**
* @Route("/new_event_email")
*/
private function sendEmail(MailerInterface $mailer)
{
$userRepository = $this->getDoctrine()->getRepository(User::class);
$users = $userRepository->findAll();
// Here you loop over the users
foreach($users as $user) {
/// Send email
}
}
理论参考:https://symfony.com/doc/current/doctrine.html
你还需要在这里了解更多关于依赖注入的信息:https://symfony.com/doc/current/components/dependency_injection.html