Я пишу пользовательскую службу Symfony, почтовую службу, для отправки всех моих писем.
Поэтому я пытаюсь внедрить почтовую программу и шаблон службы внутри пользовательского класса службы.
Я уже пробовал другие решения от stackoverflow, например, например.
10304468, но это не помогло мне.
Это мой почтовый сервис
namespace Acme\DemoBundle\Mail;
use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;
use Swift_Message;
class Mailer {
protected $mailer;
protected $templating;
public function __construct(Swift_Message $mailer, EngineInterface $templating) {
$this->mailer = $mailer;
$this->templating = $templating;
}
public function NewUserMail($newuser){
$message = new Swift_Message();
$message->newInstance()
->setSubject('Demo Subject')
->setFrom(array('[email protected]' => 'Your Company'))
->setTo($newuser->getEmail())
->setBody($this->templating->render('AcmeDemoBundle:Mail:newuser.html.twig'), 'text/html');
$this->sendMail($message);
}
public function sendMail($message) {
$this->mailer->send($message);
}
}
Это мой файл Service.yml (который загружается через файл расширения внедрения зависимостей:
acme_demo_bundle.mailer:
class: Acme\DemoBundle\Mail\Mailer
arguments: ["@mailer", "@templating"]
Теперь, когда я вызываю службу Mailer внутри контроллера, я получаю эту ошибку:
Исправляемая фатальная ошибка: аргумент 1 передан
Acme \ DemoBundle \ Mail \ Mailer :: __ construct () должен быть экземпляром
из Swift_Message, ни один не дано,
Как я вызываю почтовую службу внутри контроллера:
/...
$message = new Mailer();
$message->NewUserMail($newuser);
/...
Если я добавлю почтовый и шаблонный сервис из контейнера, при создании нового класса почтового я не получу ошибку. Но я подумал, что Service.yml вставляет сервисы в мой класс, но, очевидно, это не так.
Я также попробовал это в другом проекте Symfony, та же проблема. Похоже, я что-то здесь упускаю …. 🙁
Symfony-х DependencyInjection
на самом деле не меняет способ работы PHP. Следовательно service container
, Это просто набор компонентов, которые помогают вам централизовать реализацию вашего сервиса (который на самом деле является классом). Вы можете думать об этом очень очень просто:
class ServiceContainer{
protected $definitions;
protected $instantiated;
/**
* @param array $definitions the service definitions, e.g: the result of parsing the yml file
*/
public function __construct($definitions){
$this->definitions = $definitions;
}
public function get($service){
if(isset($this->instantiated[$service])
return $this->instantiated[$service]);
$definition = $this->definitions[$service];
$class = $definition['class'];
$arguments = $definition['arguments'];
// the resolved arguments
$args = array();
foreach($arguments as $a){
// resolveArguments will return the corresponding object/value depending on the value of the arg
// i.e: it will return an instantiated service for "@mailer"// or the parameter's value for "%some_parameter%"$args[] = $this->resolveArguments($a);
}
// now instantiate the object base on the resolved arguments
$reflector = new ReflectionClass($class);
$object = $reflector->newInstanceArgs($args);
$this->instantiated[$service] = $object;
return $object;
}
}
Других решений пока нет …