2016-12-13 5 views
2

Как я могу использовать инъекцию зависимости setter с контейнером обслуживания Laravel, чтобы иметь автоматическое разрешение зависимостей?Laravel setter injection

Вот пример:

class Test 
{ 
    (...) 

    public function setMailer(Mailer $mailer) 
    { 
     $this->mailer = $mailer; 
    } 

    (...) 

    function sendEmail() 
    { 
     $this->mailer->send(new Email('[email protected]')); 
    } 
} 

Как я могу гарантировать, что, когда sendEmail() называется, почтовая программа зависимость statisfied? Как я могу использовать сервисный контейнер Laravel для достижения этого?

Заранее спасибо.

+0

https://www.sitepoint.com/dependency-injection-laravels-ioc/ посмотреть на это. –

+0

Я ищу ответы на один и тот же вопрос ... – simhumileco

ответ

2

Нет способа гарантировать, что другой метод запущен до того, как запущен sendEmail, и единственным способом, который мог бы быть «инъекция метода», было бы setMailer.

Если вы хотите инъекции метод для метода setMailer вам придется использовать контейнер IoC, чтобы вызвать этот метод:

$a = new Test; 
app()->call([$a, 'setMailer']); 

Это будет иметь контейнер вызов setMailer на $a для вас и разрешит все зависимости, необходимые , в этом случае.

Наличие вызова контейнера sendEmail будет таким же, как и вызывать его самостоятельно, поскольку нет аргументов.

Если вы действительно хотите, чтобы почтовая программа была доступна, вы можете использовать инъекцию конструктора, чтобы у вас была почтовая программа до того, как вызывается sendEmail.

public function __construct(Mailer $mailer) 
{ 
    $this->mailer = $mailer; 
} 
Смежные вопросы