Symfony не использует внедренные сервисы

Я пишу пользовательскую службу 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, та же проблема. Похоже, я что-то здесь упускаю …. 🙁

1

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]