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

Symfony中service的认识(文档翻译)【原创】

Symfony2 祝, 毕亮 547浏览 0评论

1.什么是服务?

简而言之,服务就是在php中一种执行全局任务的一种服务,服务是一个有目的行的名字,在计算机科学中描述一个对象创建一个特殊的用例(比如:发送邮件),无论什么时候你需要他提供特许的功能,每个服务都会通过你的请求被使用,你不需要做任何特别的事来做服务,使用一些的代码来写一个php的类来实现一个特殊的任务,恭喜您,你刚刚创建了一个服务。

2.什么是服务容器?

服务容器(依赖注入容器)是一种简单的php对象,这种对象用于管理服务的实例化.假如你有一个简单的php类用于发送方邮件。没有服务容器,你就必须,当你需要的时候你就必须手动创建一个类.

use AppBundle\Mailer;
$mailer = new Mailer('sendmail');
$mailer->send('ryan@example.com', ...);

这很简单,这个虚构的类可以允许你去配置一些方法用于发送邮件。但是,如果你想在别的地方使用邮件服务呢?你也不想没次需要使用邮件服务的时候就重新配置一下邮件的程序。假使你在你的程序的任何地方都需要改变从发送邮件到邮件协议的传输方式,这将会是什么样的情况呢?

3.在容器中创建和配置服务

对于你,最好的答案就是利用容器来创建邮件的服务对象。为了实现这个,你必须让容器知道怎么创建发送邮件服务.

以下用例:

# app/config/services.ymlservices:
    app.mailer:  //服务的简称
        class:        AppBundle\Mailer // 服务所处类的路径
        arguments:    [sendmail]  //参数(见下)

当symfony初始化的时候,会创建服务容器。(默认的是app/config/config.yml),这个精确的文件是通过AppKernel::registerContainerConfiguration()文件来加载的。加载一个特定的环境配置文件(生产模式和开放模式)

经过服务容器,现在AppBundle\Mailer实例的类是有用的了。你可以在symfony的任何控制器内通过get()方法来获取该服务了.

class HelloController extends Controller{
    // ...

    public function sendEmailAction()
    {
        // ...
        $mailer = $this->get('app.mailer');
        $mailer->send('ryan@foobar.net', ...);
    }}

当你在容器中需要使用app.mailer的服务时,容器就会构造一个对象并且将这个对象返回给你.使用服务容器的另一大优点就是当你需要的时候服务才会构建,如果拟定义了一个服务并且在请求中从未使用它,这个服务就不会被创建。加快了你的应用程序的速度和节省了内存。也就意味着定义再多的服务,对应用程序的性能基本没有什么影响。因为服务如果没有被使用,就永远不会被创建。

4.服务的参数

创建新服务(即对象)通过容器很简单,参数使服务的定义变得更加有序和灵活。

# app/config/services.ymlparameters:
    app.mailer.transport:  sendmailservices:
    app.mailer:
        class:        AppBundle\Mailer
        arguments:    ['%app.mailer.transport%']

最终的结果和之前的结果是一样的,不同的地方是你怎么定义服务。使用%%符号将字符串app.mailer.transport封装起来。当容器创建了,容器通过名字来寻找对应的参数,查找参数对应的值,并且在服务的定义中使用它。

在YMAL中,如果你想要使用字符串,那么就用@作为参数的值(列如:非常安全的邮件的密码),你要想获取他还需要添加另外一个@。这只适用于YMAL格式的文件.

# app/config/parameters.yml
parameters:
    # This will be parsed as string '@securepass'
    mailer_password: '@@securepass'
parameters:
    say.hello.class: AdminBundle\AdminService\Check
    say.hello.paramter: '@@343'
    
services:
    echo.hello:
          class: %say.hello.class%
          arguments: [%say.hello.paramter%]

对于parameter的参数的定义,在项目中,我们可以通过$this->getParameter(‘mailer_password’);的方法来获取我们在服务或者yml格式里面定义的参数的值;

5.参数数组

参数并不仅仅只有字符串,他们可能也包含数组值,对于xml的格式,对于所有的参数是数组的,你需要使用type=”collection”格式.

如下:在服务中心定义一个数组;

parameters:
    say.hello.class: AdminBundle\AdminService\Check
    say.hello.paramter: [service3, service4, service5]
    say.hello.array:
             main1:
                  - mainarray1
                  - main1array2
             main2:
                  - main2array1
                  - main2array2

得到的值为:

blob.png

今天的学习就这么多,未完待续。。。。

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


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

您必须 登录 才能发表评论!