您的位置:首页 > 大数据 > 人工智能

symfony2 服务容器(Service Container)

2016-02-05 14:07 411 查看
1.什么是Service Container?Service Container服务容器(或依赖注入容器)是一个简单的PHP对象管理服务实例(即对象)。例如,假设你有一个简单的PHP类,提供电子邮件。没有服务容器,您必须手动创建对象,只要您需要它:
use Acme\HelloBundle\Mailer;
$mailer = new Mailer('sendmail');
$mailer->send('ryan@example.com', ...);
但如果你想在其他地方使用邮件服务吗?你肯定不想重复的邮件配置每次你需要使用邮件对象。如果你需要改变运输从Sendmail SMTP的应用无处不在?你需要追踪每个地方你创建一个邮件服务和改变它。
2.这时候需要这么做

在Container中创建/配置Service,最好的答案是让服务容器中创建你的邮件对象。为了这项工作,你必须教容器如何创建邮件服务。这是通过配置,可以指定在YAML。

# app/config/config.yml services: my_mailer: class: Acme\HelloBundle\Mailer arguments: [sendmail]
现在这个对象可以在symfony中的任意控制器中,通过get()方法访问容器的服务
class HelloController extends Controller
{
public function sendEmailAction()
{
$mailer = $this->get('my_mailer');
$mailer->send('ryan@foobar.net', ...);
}
}
当你使用服务的时候。容器构造对象并返回它。这是使用该服务容器的另一个主要优点。也就是说,一个服务是从来没有构建,直到它的需要。如果你定义了一个服务,而不使用它的请求,服务就永远不会被创建。这节省了内存,提高了应用程序的速度。这也意味着,很少有或没有表现为定义大量的服务的性能。从未使用过的服务从未构建。
3.Service的参数
通过容器创建新的服务(即对象)是非常简单的。参数使定义服务更加有组织性和灵活性:
# app/config/config.yml
parameters:
my_mailer.transport:  sendmail

services:
my_mailer:
class:        Acme\HelloBundle\Mailer
arguments:    ["%my_mailer.transport%"]

4.导入其他Container配置(使用
imports
导入)

@1第一步
# src/Acme/HelloBundle/Resources/config/services.yml
parameters:
my_mailer.transport:  sendmail
services:
my_mailer:
class:        Acme\HelloBundle\Mailer
arguments:    ["%my_mailer.transport%"]
@第二步
# app/config/config.yml
imports:
- { resource: "@AcmeHelloBundle/Resources/config/services.yml" }

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: