Search code examples
phpsymfonyswiftmailer

use SwiftMailer in Command - Symfon 4.1


I created a simple command witch takes url and look if website is up if not send email to me, but the problem is i don`t know how to add SwiftMailer to Command execute.

    <?php

namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use App\Entity\Products;
use App\Entity\Settings;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;

class CheckwebsitesCommand extends ContainerAwareCommand
{
    protected static $defaultName = 'checkwebsites';

    protected function configure()
    {
        $this
            ->setName('app:checkwebsites')
            ->setDescription('Add a short description for your command')

        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output, \Swift_Mailer $mailer)
    {

if i add a:

protected function execute(InputInterface $input, OutputInterface $output, \Swift_Mailer $mailer)
{

then i have a error:

 Warning: Declaration of App\Command\CheckwebsitesCommand::execute(Symfony\Component\Console\Input\InputInterface $input, Symfony\Component\Console\Output\OutputInterface $output, $id)
  should be compatible with Symfony\Component\Console\Command\Command::execute(Symfony\Component\Console\Input\InputInterface $input, Symfony\Component\Console\Output\OutputInterface $ou
  tput)

i cant understand this "Commands" thing, why i cany just attach bundles witch, as i want ? I wanna use Commands to setup crons.

******EDIT

   foreach($websites as $website) {
                       $www = $website->getJson();
                       $online = url_test($www['website']['www']);
                       if(!$online) {
                         $message = (new \Swift_Message('Nie działa strona '.$www['website']['www'].' !'))
                         ->setFrom(''.$emailform.'')
                         ->setTo(''.$emailform.'')
                         ->setBody(
                           $this->templating->renderView(
                             'emails/websitenoworking.html.twig',
                             array(
                               'www' => $website['website']['www'],
                             )
                           ),
                           'text/html'
                         );
                         $mailer->send($message);
                       }
                     }

Solution

  • Just to follow up a bit on my injection comment, given that you are using S4.1 you should probably avoid using the ContainerAwareCommand as well. Using the container as a service locator is so last year. Strict dependency injection is the recommended approach.

    namespace App\Command;
    
    use Twig\Environment;
    use Doctrine\ORM\EntityManagerInterface;
    use Symfony\Component\Console\Command\Command;
    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Output\OutputInterface;
    
    class MailerCommand extends Command
    {
        private $entityManager;
        private $mailer;
        private $twig;
    
        public function __construct(
            EntityManagerInterface $entityManager, 
            \Swift_Mailer $mailer,
            Environment $twig
        )
        {
            parent::__construct();
            $this->entityManager = $entityManager;
            $this->mailer = $mailer;
            $this->twig = $twig;
        }
        protected function configure()
        {
            $this
                ->setName('app:checkwebsites')
                ->setDescription('Add a short description for your command')
            ;
        }
        protected function execute(InputInterface $input, OutputInterface $output)
        {
            echo "Hello there\n";
        }
    }