在命令中使用 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.');
}
}
我创建了一个简单的命令 使用 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.');
}
}