Symfony 4 Accessing Swift_Mailer in Service
I have been looking at the Symfony 4.1 documentation on using the Swift_mailer. However, it appears the documentation is only assumed it being used in the Controller classes. I'm trying to create a Service with some reusable functions that send email.
I created a EmailService.php file in my service directory. When creating a new instance of this service, it quickly throws and error:
"Too few arguments to function
AppServiceEmailService::__construct(), 0 passed in
*MyAppsrcControllerTestController.php on line 33
and exactly 1 expected"
I'm not sure how to pass Swift_Mailer $mailer into the __construct correctly? I have auto wiring enabled in the services.yaml, so i'm not sure what I need to do differently?
class EmailService
{
private $from = 'support@******.com';
private $mailer;
public function __construct(Swift_Mailer $mailer)
{
$this->mailer = $mailer;
}
How do I pass the Swift_Mailer into this EmailService construct?
I tried adding this to my configservices.yaml with no success:
AppServiceEmailService:
arguments: ['@mailer']
symfony swiftmailer symfony4
add a comment |
I have been looking at the Symfony 4.1 documentation on using the Swift_mailer. However, it appears the documentation is only assumed it being used in the Controller classes. I'm trying to create a Service with some reusable functions that send email.
I created a EmailService.php file in my service directory. When creating a new instance of this service, it quickly throws and error:
"Too few arguments to function
AppServiceEmailService::__construct(), 0 passed in
*MyAppsrcControllerTestController.php on line 33
and exactly 1 expected"
I'm not sure how to pass Swift_Mailer $mailer into the __construct correctly? I have auto wiring enabled in the services.yaml, so i'm not sure what I need to do differently?
class EmailService
{
private $from = 'support@******.com';
private $mailer;
public function __construct(Swift_Mailer $mailer)
{
$this->mailer = $mailer;
}
How do I pass the Swift_Mailer into this EmailService construct?
I tried adding this to my configservices.yaml with no success:
AppServiceEmailService:
arguments: ['@mailer']
symfony swiftmailer symfony4
4
And how are you trying to access your EmailService? I suspect you are trying to new it.
– Cerad
Nov 13 '18 at 3:27
Correct, "new EmailService()"
– Speedy059
Nov 13 '18 at 3:38
1
Please use either Constructor injection or inject the service into your action by just adding it as argument to the method e.g.public function index(Request $request, EmailService $emailService) {...}
.
– dbrumann
Nov 13 '18 at 8:06
add a comment |
I have been looking at the Symfony 4.1 documentation on using the Swift_mailer. However, it appears the documentation is only assumed it being used in the Controller classes. I'm trying to create a Service with some reusable functions that send email.
I created a EmailService.php file in my service directory. When creating a new instance of this service, it quickly throws and error:
"Too few arguments to function
AppServiceEmailService::__construct(), 0 passed in
*MyAppsrcControllerTestController.php on line 33
and exactly 1 expected"
I'm not sure how to pass Swift_Mailer $mailer into the __construct correctly? I have auto wiring enabled in the services.yaml, so i'm not sure what I need to do differently?
class EmailService
{
private $from = 'support@******.com';
private $mailer;
public function __construct(Swift_Mailer $mailer)
{
$this->mailer = $mailer;
}
How do I pass the Swift_Mailer into this EmailService construct?
I tried adding this to my configservices.yaml with no success:
AppServiceEmailService:
arguments: ['@mailer']
symfony swiftmailer symfony4
I have been looking at the Symfony 4.1 documentation on using the Swift_mailer. However, it appears the documentation is only assumed it being used in the Controller classes. I'm trying to create a Service with some reusable functions that send email.
I created a EmailService.php file in my service directory. When creating a new instance of this service, it quickly throws and error:
"Too few arguments to function
AppServiceEmailService::__construct(), 0 passed in
*MyAppsrcControllerTestController.php on line 33
and exactly 1 expected"
I'm not sure how to pass Swift_Mailer $mailer into the __construct correctly? I have auto wiring enabled in the services.yaml, so i'm not sure what I need to do differently?
class EmailService
{
private $from = 'support@******.com';
private $mailer;
public function __construct(Swift_Mailer $mailer)
{
$this->mailer = $mailer;
}
How do I pass the Swift_Mailer into this EmailService construct?
I tried adding this to my configservices.yaml with no success:
AppServiceEmailService:
arguments: ['@mailer']
symfony swiftmailer symfony4
symfony swiftmailer symfony4
asked Nov 13 '18 at 1:05
Speedy059Speedy059
1079
1079
4
And how are you trying to access your EmailService? I suspect you are trying to new it.
– Cerad
Nov 13 '18 at 3:27
Correct, "new EmailService()"
– Speedy059
Nov 13 '18 at 3:38
1
Please use either Constructor injection or inject the service into your action by just adding it as argument to the method e.g.public function index(Request $request, EmailService $emailService) {...}
.
– dbrumann
Nov 13 '18 at 8:06
add a comment |
4
And how are you trying to access your EmailService? I suspect you are trying to new it.
– Cerad
Nov 13 '18 at 3:27
Correct, "new EmailService()"
– Speedy059
Nov 13 '18 at 3:38
1
Please use either Constructor injection or inject the service into your action by just adding it as argument to the method e.g.public function index(Request $request, EmailService $emailService) {...}
.
– dbrumann
Nov 13 '18 at 8:06
4
4
And how are you trying to access your EmailService? I suspect you are trying to new it.
– Cerad
Nov 13 '18 at 3:27
And how are you trying to access your EmailService? I suspect you are trying to new it.
– Cerad
Nov 13 '18 at 3:27
Correct, "new EmailService()"
– Speedy059
Nov 13 '18 at 3:38
Correct, "new EmailService()"
– Speedy059
Nov 13 '18 at 3:38
1
1
Please use either Constructor injection or inject the service into your action by just adding it as argument to the method e.g.
public function index(Request $request, EmailService $emailService) {...}
.– dbrumann
Nov 13 '18 at 8:06
Please use either Constructor injection or inject the service into your action by just adding it as argument to the method e.g.
public function index(Request $request, EmailService $emailService) {...}
.– dbrumann
Nov 13 '18 at 8:06
add a comment |
2 Answers
2
active
oldest
votes
As mentioned by dbrumann in a comment, I needed to follow the proper way of injecting services.
First, I needed to add the services to config/services.yaml
#config/services.yaml
emailservice:
class: AppServiceEmailService
arguments: ['@swiftmailer.mailer.default', '@twig']
public: true
Second, I need to setup the service to accept both the mailer, and twig for rendering the template.
#App/Service/EmailService.php
<?php
namespace AppService;
class EmailService
{
private $from = 'support@*****.com';
private $mailer;
private $templating;
public function __construct(Swift_Mailer $mailer, TwigEnvironment $templating)
{
$this->mailer = $mailer;
$this->templating = $templating;
}
public function userConfirmation(string $recipient, string $confCode) : bool
{
$message = (new Swift_Message())
->setSubject('Some sort of string')
->setFrom($this->from)
->setTo($recipient)
->setBody(
$this->templating->render(
'email/UserConfirmation.html.twig',
array('confCode' => $confCode)
),
'text/html'
)
/*
* If you also want to include a plaintext version of the message
->addPart(
$this->renderView(
'emails/UserConfirmation.txt.twig',
array('confCode' => $confCode)
),
'text/plain'
)
*/
;
return $this->mailer->send($message);
}
}
Third, to call it from the controller, make sure your controller is extending Controller and not the AbstractController! Crucial step!! Here is an example based on the parameters I require in my service:
public function userConfirmation()
{
$emailService = $this->get('emailservice');
$sent = $emailService->userConfirmation('some@emailaddress.com', '2ndParam');
return new Response('Success') //Or whatever you want to return
}
I hope this helps people. AbstractController does not give you the proper access to the service containers.
add a comment |
Try :
#config/services.yaml
AppServiceEmailService
arguments: ['@swiftmailer.mailer.default', '@twig']
public: true
And in your controller :
public function userConfirmation(EmailService $emailService)
{
$sent = $emailService->userConfirmation('some@emailaddress.com', '2ndParam');
return new Response('Success') //Or whatever you want to return
}
You work with symfony 4.1 so you don't call service container in controller anymore ...
https://symfony.com/doc/current/service_container/3.3-di-changes.html
Also you can use FQCN "AppServiceMyService" to declare services in services.yaml and a proper legacy_aliases.yaml file to declare legacy aliases like "app.service.my.service" it helps keep your services.yaml clean in my opinion ...
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53272302%2fsymfony-4-accessing-swift-mailer-in-service%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
As mentioned by dbrumann in a comment, I needed to follow the proper way of injecting services.
First, I needed to add the services to config/services.yaml
#config/services.yaml
emailservice:
class: AppServiceEmailService
arguments: ['@swiftmailer.mailer.default', '@twig']
public: true
Second, I need to setup the service to accept both the mailer, and twig for rendering the template.
#App/Service/EmailService.php
<?php
namespace AppService;
class EmailService
{
private $from = 'support@*****.com';
private $mailer;
private $templating;
public function __construct(Swift_Mailer $mailer, TwigEnvironment $templating)
{
$this->mailer = $mailer;
$this->templating = $templating;
}
public function userConfirmation(string $recipient, string $confCode) : bool
{
$message = (new Swift_Message())
->setSubject('Some sort of string')
->setFrom($this->from)
->setTo($recipient)
->setBody(
$this->templating->render(
'email/UserConfirmation.html.twig',
array('confCode' => $confCode)
),
'text/html'
)
/*
* If you also want to include a plaintext version of the message
->addPart(
$this->renderView(
'emails/UserConfirmation.txt.twig',
array('confCode' => $confCode)
),
'text/plain'
)
*/
;
return $this->mailer->send($message);
}
}
Third, to call it from the controller, make sure your controller is extending Controller and not the AbstractController! Crucial step!! Here is an example based on the parameters I require in my service:
public function userConfirmation()
{
$emailService = $this->get('emailservice');
$sent = $emailService->userConfirmation('some@emailaddress.com', '2ndParam');
return new Response('Success') //Or whatever you want to return
}
I hope this helps people. AbstractController does not give you the proper access to the service containers.
add a comment |
As mentioned by dbrumann in a comment, I needed to follow the proper way of injecting services.
First, I needed to add the services to config/services.yaml
#config/services.yaml
emailservice:
class: AppServiceEmailService
arguments: ['@swiftmailer.mailer.default', '@twig']
public: true
Second, I need to setup the service to accept both the mailer, and twig for rendering the template.
#App/Service/EmailService.php
<?php
namespace AppService;
class EmailService
{
private $from = 'support@*****.com';
private $mailer;
private $templating;
public function __construct(Swift_Mailer $mailer, TwigEnvironment $templating)
{
$this->mailer = $mailer;
$this->templating = $templating;
}
public function userConfirmation(string $recipient, string $confCode) : bool
{
$message = (new Swift_Message())
->setSubject('Some sort of string')
->setFrom($this->from)
->setTo($recipient)
->setBody(
$this->templating->render(
'email/UserConfirmation.html.twig',
array('confCode' => $confCode)
),
'text/html'
)
/*
* If you also want to include a plaintext version of the message
->addPart(
$this->renderView(
'emails/UserConfirmation.txt.twig',
array('confCode' => $confCode)
),
'text/plain'
)
*/
;
return $this->mailer->send($message);
}
}
Third, to call it from the controller, make sure your controller is extending Controller and not the AbstractController! Crucial step!! Here is an example based on the parameters I require in my service:
public function userConfirmation()
{
$emailService = $this->get('emailservice');
$sent = $emailService->userConfirmation('some@emailaddress.com', '2ndParam');
return new Response('Success') //Or whatever you want to return
}
I hope this helps people. AbstractController does not give you the proper access to the service containers.
add a comment |
As mentioned by dbrumann in a comment, I needed to follow the proper way of injecting services.
First, I needed to add the services to config/services.yaml
#config/services.yaml
emailservice:
class: AppServiceEmailService
arguments: ['@swiftmailer.mailer.default', '@twig']
public: true
Second, I need to setup the service to accept both the mailer, and twig for rendering the template.
#App/Service/EmailService.php
<?php
namespace AppService;
class EmailService
{
private $from = 'support@*****.com';
private $mailer;
private $templating;
public function __construct(Swift_Mailer $mailer, TwigEnvironment $templating)
{
$this->mailer = $mailer;
$this->templating = $templating;
}
public function userConfirmation(string $recipient, string $confCode) : bool
{
$message = (new Swift_Message())
->setSubject('Some sort of string')
->setFrom($this->from)
->setTo($recipient)
->setBody(
$this->templating->render(
'email/UserConfirmation.html.twig',
array('confCode' => $confCode)
),
'text/html'
)
/*
* If you also want to include a plaintext version of the message
->addPart(
$this->renderView(
'emails/UserConfirmation.txt.twig',
array('confCode' => $confCode)
),
'text/plain'
)
*/
;
return $this->mailer->send($message);
}
}
Third, to call it from the controller, make sure your controller is extending Controller and not the AbstractController! Crucial step!! Here is an example based on the parameters I require in my service:
public function userConfirmation()
{
$emailService = $this->get('emailservice');
$sent = $emailService->userConfirmation('some@emailaddress.com', '2ndParam');
return new Response('Success') //Or whatever you want to return
}
I hope this helps people. AbstractController does not give you the proper access to the service containers.
As mentioned by dbrumann in a comment, I needed to follow the proper way of injecting services.
First, I needed to add the services to config/services.yaml
#config/services.yaml
emailservice:
class: AppServiceEmailService
arguments: ['@swiftmailer.mailer.default', '@twig']
public: true
Second, I need to setup the service to accept both the mailer, and twig for rendering the template.
#App/Service/EmailService.php
<?php
namespace AppService;
class EmailService
{
private $from = 'support@*****.com';
private $mailer;
private $templating;
public function __construct(Swift_Mailer $mailer, TwigEnvironment $templating)
{
$this->mailer = $mailer;
$this->templating = $templating;
}
public function userConfirmation(string $recipient, string $confCode) : bool
{
$message = (new Swift_Message())
->setSubject('Some sort of string')
->setFrom($this->from)
->setTo($recipient)
->setBody(
$this->templating->render(
'email/UserConfirmation.html.twig',
array('confCode' => $confCode)
),
'text/html'
)
/*
* If you also want to include a plaintext version of the message
->addPart(
$this->renderView(
'emails/UserConfirmation.txt.twig',
array('confCode' => $confCode)
),
'text/plain'
)
*/
;
return $this->mailer->send($message);
}
}
Third, to call it from the controller, make sure your controller is extending Controller and not the AbstractController! Crucial step!! Here is an example based on the parameters I require in my service:
public function userConfirmation()
{
$emailService = $this->get('emailservice');
$sent = $emailService->userConfirmation('some@emailaddress.com', '2ndParam');
return new Response('Success') //Or whatever you want to return
}
I hope this helps people. AbstractController does not give you the proper access to the service containers.
answered Nov 14 '18 at 6:28
Speedy059Speedy059
1079
1079
add a comment |
add a comment |
Try :
#config/services.yaml
AppServiceEmailService
arguments: ['@swiftmailer.mailer.default', '@twig']
public: true
And in your controller :
public function userConfirmation(EmailService $emailService)
{
$sent = $emailService->userConfirmation('some@emailaddress.com', '2ndParam');
return new Response('Success') //Or whatever you want to return
}
You work with symfony 4.1 so you don't call service container in controller anymore ...
https://symfony.com/doc/current/service_container/3.3-di-changes.html
Also you can use FQCN "AppServiceMyService" to declare services in services.yaml and a proper legacy_aliases.yaml file to declare legacy aliases like "app.service.my.service" it helps keep your services.yaml clean in my opinion ...
add a comment |
Try :
#config/services.yaml
AppServiceEmailService
arguments: ['@swiftmailer.mailer.default', '@twig']
public: true
And in your controller :
public function userConfirmation(EmailService $emailService)
{
$sent = $emailService->userConfirmation('some@emailaddress.com', '2ndParam');
return new Response('Success') //Or whatever you want to return
}
You work with symfony 4.1 so you don't call service container in controller anymore ...
https://symfony.com/doc/current/service_container/3.3-di-changes.html
Also you can use FQCN "AppServiceMyService" to declare services in services.yaml and a proper legacy_aliases.yaml file to declare legacy aliases like "app.service.my.service" it helps keep your services.yaml clean in my opinion ...
add a comment |
Try :
#config/services.yaml
AppServiceEmailService
arguments: ['@swiftmailer.mailer.default', '@twig']
public: true
And in your controller :
public function userConfirmation(EmailService $emailService)
{
$sent = $emailService->userConfirmation('some@emailaddress.com', '2ndParam');
return new Response('Success') //Or whatever you want to return
}
You work with symfony 4.1 so you don't call service container in controller anymore ...
https://symfony.com/doc/current/service_container/3.3-di-changes.html
Also you can use FQCN "AppServiceMyService" to declare services in services.yaml and a proper legacy_aliases.yaml file to declare legacy aliases like "app.service.my.service" it helps keep your services.yaml clean in my opinion ...
Try :
#config/services.yaml
AppServiceEmailService
arguments: ['@swiftmailer.mailer.default', '@twig']
public: true
And in your controller :
public function userConfirmation(EmailService $emailService)
{
$sent = $emailService->userConfirmation('some@emailaddress.com', '2ndParam');
return new Response('Success') //Or whatever you want to return
}
You work with symfony 4.1 so you don't call service container in controller anymore ...
https://symfony.com/doc/current/service_container/3.3-di-changes.html
Also you can use FQCN "AppServiceMyService" to declare services in services.yaml and a proper legacy_aliases.yaml file to declare legacy aliases like "app.service.my.service" it helps keep your services.yaml clean in my opinion ...
answered Nov 14 '18 at 11:08
Yoann MirYoann Mir
865
865
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53272302%2fsymfony-4-accessing-swift-mailer-in-service%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
4
And how are you trying to access your EmailService? I suspect you are trying to new it.
– Cerad
Nov 13 '18 at 3:27
Correct, "new EmailService()"
– Speedy059
Nov 13 '18 at 3:38
1
Please use either Constructor injection or inject the service into your action by just adding it as argument to the method e.g.
public function index(Request $request, EmailService $emailService) {...}
.– dbrumann
Nov 13 '18 at 8:06