Как отправлять новости конкретным подписчикам с определенными тегами?

У меня есть база данных с подписчиками, которые подписаны на определенные теги, и новые новости, которые нужно отправлять подписчикам. Мне нужно написать команду на 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();
                }
            }
        }
    }
}

Но это не работает. Не могли бы вы помочь?

Можете дать определение "не работает"? Вы получаете сообщение об ошибке? Какой результат вы ожидаете?

msg 17.06.2019 11:10

Проблема в том, что он не опирается на теги и новые новости, я не знаю, как связать воедино теги, новые новости и подписчиков. Он должен отправлять только недавно созданные новости с определенными тегами. Я ожидаю, что он должен рассылать его не всем письмам и всем подписчикам, а только конкретным.

Clarity 17.06.2019 11:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
2
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я так понимаю, у подписчиков есть набор тегов, на которые они подписаны, и новости связаны с тегом.

Если это так, вам нужно добавить пару условий в свой цикл, например:

 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...
                }
            }
        }
    }

Что делать, если есть новости с парой тегов?

Clarity 17.06.2019 15:27

в этом случае вы должны использовать: $relatedTags = $new->getTags(); if (sizeof(array_intersect($subscribedTags, $relatedTags) > 0) { ... }

Dennis de Best 02.12.2019 14:20

Спасибо, это здорово!

Clarity 29.01.2020 15:47

Другие вопросы по теме