最新消息:文章中包含代码时,请遵守代码高亮规范!

Symfony中service 注入(两种方式)【原创】

PHP 祝, 毕亮 1194浏览 0评论

1.通过构造函数进行注入

到目前为止, 原始的发送邮件服务非常的简单,他很容易配置因为他只有一个参数。正如你说看到的,在容器中,当你需要创建的服务需要依赖一个或者多个服务的时候,这时候容器的潜力就实现了。例如,假设你有一个新的服务。NewsletterManager管理邮件消息的准备和发送到收集地址

当然,app.mailer的服务在发送邮件这方面做得很好。你可以在NewsletterManager 类里面使用它发送邮件。这个类如下:

php文件:


<?php

/**
 * 注释
 * Author: Galen
 * Datetime: 2/9/17 6:15 PM
 */
namespace  AdminBundle\AnotherService;
class Another
{
    public function  otherSayHello()
    {
        echo "i am a second service";
    }
}
<?php

/**
 * 注释
 * Author: Galen
 * Datetime: 2/9/17 5:44 PM
 */
namespace  UserBundle\UseAdminService;
use AdminBundle\AdminService\Check;

class UseAdmin
{
    protected  $say;
    public function  __construct($mailers)
    {
        $this->say = $mailers;
    }
}

app/config/services.yml

services:
    app.exception_listener:
        class: AdminBundle\EventListener\ExceptionListener
        tags:
            - { name: kernel.event_listener, event: kernel.exception }
    ther.hello:
              class: AdminBundle\AnotherService\Another

    echo.children.hello:
            class: UserBundle\UseAdminService\UseAdmin
            arguments: ['@ther.hello']

在YML文件中,@ther.hello会告诉容器查找名为ther.hello的这个服务。并且将他的对象注入到UserAdmin的构造函数中.既然这样这个特殊的ther.hello就必须要存在,如果不存在就会报出异常。

总结一下就是,通过构造函数在一个服务中调用另外一个服务。

2.使用setter进行注入

上面的原理就是使用类的构造函数进行注入的,而这里则是通过类的方法进行注入对象。只需要改变一下yml的配置即可,如下:

 echo.children.hello:
            class: UserBundle\UseAdminService\UseAdmin
#            arguments: ['@ther.hello']
            calls:
                  - [setService, ['@ther.hello']]

当你在controller中调用该服务时,服务容器会将ther.hello对应的对象注入到setService对应的方法中去。很简单。

两种方法都是事先关于服务的注入问题。如有不足之处,希望大家纠正.

转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/19922.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者Galen的打赏,我们会更加努力!    如果您想成为作者,请点我

发表我的评论
取消评论

表情