У меня есть база данных с подписчиками, которые подписаны на определенные теги, и новые новости, которые нужно отправлять подписчикам. Мне нужно написать команду на Symfony 4, которая это сделает. У меня уже есть этот код:
class SubscribeLauncherCommand extends ContainerAwareCommand
{
protected static $defaultName = 'app:subscribe-launcher';
private $mailer;
protected $em;
public function __construct(EntityManagerInterface $em, \Swift_Mailer $mailer)
{
$this->mailer = $mailer;
$this->em = $em;
parent::__construct();
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$news = $this->em->getRepository(News::class)->findBy(array(), array('date_created' => 'DESC'));
$subscribers = $this->em->getRepository(NewsSubscribe::class)->findBy(array('confirmed' => true));
$tags = $this->em->getRepository(Tag::class)->findAll();
$first_new_date = $news[0]->getDateCreated();
/** @var NewsSubscribe $subscribers */
/** @var \Swift_Message $message */
foreach ($subscribers as $subscriber) {
foreach ($news as $new)
{
if ($new->getDateCreated() < $first_new_date) {
$message = (new \Swift_Message('Test Email'))
->setFrom('[email protected]')
->setTo($subscriber->getEmail())
->setBody(
'test',
'text/html');
$first_new_date = $new->getDateCreated();
}
}
}
}
}
Но это не работает. Не могли бы вы помочь?
Проблема в том, что он не опирается на теги и новые новости, я не знаю, как связать воедино теги, новые новости и подписчиков. Он должен отправлять только недавно созданные новости с определенными тегами. Я ожидаю, что он должен рассылать его не всем письмам и всем подписчикам, а только конкретным.






Я так понимаю, у подписчиков есть набор тегов, на которые они подписаны, и новости связаны с тегом.
Если это так, вам нужно добавить пару условий в свой цикл, например:
foreach ($subscribers as $subscriber) {
$subscribedTags = $subscriber->getSubscribedTags();
foreach ($news as $new)
{
if ($new->getDateCreated() < $first_new_date) {
$relatedTag = $new->getTag();
if (in_array($relatedTag, $subscribedTags)){ //Check if the user is subscribed to the particular tag of this news
...Send the email...
}
}
}
}
Что делать, если есть новости с парой тегов?
в этом случае вы должны использовать: $relatedTags = $new->getTags(); if (sizeof(array_intersect($subscribedTags, $relatedTags) > 0) { ... }
Спасибо, это здорово!
Можете дать определение "не работает"? Вы получаете сообщение об ошибке? Какой результат вы ожидаете?