在命令中使用 SwiftMailer - Symfon 4.1

use SwiftMailer in Command - Symfon 4.1

我创建了一个简单的命令 使用 url 并查看网站是否正常运行(如果不向我发送电子邮件),但问题是我不知道如何将 SwiftMailer 添加到命令执行.

    <?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)
    {

如果我添加:

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

然后我有一个错误:

 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)

我可以t understand this "Commands" thing, why i can只附加捆绑包 ,如我所愿?我想使用命令来设置 crons。

******编辑

   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);
                       }
                     }

只是想跟进一下我的注入评论,鉴于您使用的是 S4.1,您可能也应该避免使用 ContainerAwareCommand。使用容器作为服务定位器是去年的事了。严格依赖注入是推荐的方法。

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";
    }
}

全部工作:

<?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 Twig\Environment;

class CheckwebsitesCommand 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 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)
    {
        $io = new SymfonyStyle($input, $output);



                    $websites = $this->entityManager
                     ->getRepository(Products::class)
                     ->findBy([
                       'type' => 1,
                     ]);

                     $settings = $this->entityManager
                     ->getRepository(Settings::class)
                     ->findOneBy([
                       'id' => 1,
                     ]);
                     $json = $settings->getJson();
                     foreach($json as $prop) {
                       foreach($prop as $key => $value) {
                         $$key = $value;
                       }
                     }

                      //funkcja sprawdzająca czy strona działa
                      function url_test( $url ) {
                              $timeout = 10;
                              $ch = curl_init();
                              curl_setopt ( $ch, CURLOPT_URL, $url );
                              curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
                              curl_setopt ( $ch, CURLOPT_TIMEOUT, $timeout );
                              $http_respond = curl_exec($ch);
                              $http_respond = trim( strip_tags( $http_respond ) );
                              $http_code = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
                              if ( ( $http_code == "200" ) || ( $http_code == "302" ) ) {
                                return true;
                              } else {
                                // return $http_code;, possible too
                                return false;
                              }
                              curl_close( $ch );
                            }




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

                             )
                           ),
                           'text/html'
                         );
                         $mailer->send($message);
                       }
                     }


        $io->success('Sprawdzono wszystkie strony.');
    }
}