- Zend Framework 教程
- Zend Framework - 首页
- Zend Framework - 简介
- Zend Framework - 安装
- 框架应用程序
- Zend Framework - MVC 架构
- Zend Framework - 概念
- Zend Framework - 服务管理器
- Zend Framework - 事件管理器
- Zend Framework - 模块系统
- 应用程序结构
- Zend Framework - 创建模块
- Zend Framework - 控制器
- Zend Framework - 路由
- Zend Framework - 视图层
- Zend Framework - 布局
- 模型与数据库
- 不同的数据库
- 表单与验证
- Zend Framework - 文件上传
- Zend Framework - Ajax
- Cookie 管理
- 会话管理
- Zend Framework - 身份验证
- 邮件管理
- Zend Framework - 单元测试
- Zend Framework - 错误处理
- Zend Framework - 工作示例
- Zend Framework 有用资源
- Zend Framework - 快速指南
- Zend Framework - 有用资源
- Zend Framework - 讨论
Zend Framework - 服务管理器
Zend Framework 包含一个强大的服务定位器模式实现,称为zend-servicemanager。Zend Framework 广泛地将其用于所有功能。服务管理器为 Zend Framework 提供了高级抽象。它还可以很好地与 Zend Framework 的所有其他组件集成。
安装服务管理器
可以使用composer工具安装服务管理器组件。
composer require zendframework/zend-servicemanager
示例
首先,所有服务都需要注册到服务管理器中。服务注册到服务器管理器系统后,可以随时以最小的努力访问它。服务管理器提供了许多注册服务的选项。一个简单的示例如下:
use Zend\ServiceManager\ServiceManager; use Zend\ServiceManager\Factory\InvokableFactory; use stdClass; $serviceManager = new ServiceManager([ 'factories' => [stdClass::class => InvokableFactory::class,], ]);
上述代码使用Factory选项将stdClass注册到系统中。现在,我们可以使用服务管理器的get()方法随时获取stdClass的实例,如下所示。
use Zend\ServiceManager\ServiceManager; $object = $serviceManager->get(stdClass::class);
get() 方法共享检索到的对象,因此,多次调用 get() 方法返回的对象是同一个实例。为了每次获取不同的实例,服务管理器提供了另一个方法,即build()方法。
use Zend\ServiceManager\ServiceManager; $a = $serviceManager->build(stdClass::class); $b = $serviceManager->build(stdClass::class);
服务管理器注册
服务管理器提供了一组注册组件的方法。一些最重要的方法如下:
- 工厂方法
- 抽象工厂方法
- 初始化方法
- 委托工厂方法
我们将在接下来的章节中详细讨论这些方法。
工厂方法
工厂基本上是任何可调用对象或任何实现FactoryInterface (Zend\ServiceManager\Factory\FactoryInterface) 的类。
FactoryInterface 只有一个方法:
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
FactoryInterface 的参数详细信息如下:
container (ContainerInterface) - 它是 ServiceManager 的基本接口。它提供了一个获取其他服务的选项。
requestedName - 它是服务名称。
options - 它提供了服务所需的附加选项。
让我们创建一个简单的实现 FactoryInterface 的类,看看如何注册该类。
类 Test - 要检索的对象
use stdClass; class Test { public function __construct(stdClass $sc) { // use $sc } }
Test 类依赖于 stdClass。
类 TestFactory - 初始化 Test 对象的类
class TestFactory implements FactoryInterface { public function __invoke(ContainerInterface $container, $requestedName, array $options = null) { $dep = $container->get(stdClass::class); return new Test($dep); } }
TestFactory 使用容器检索 stdClass,创建 Test 类的实例并返回它。
Zend Framework 的注册和使用
现在让我们了解如何注册和使用 Zend Framework。
serviceManager $sc = new ServiceManager([ 'factories' => [stdClass::class => InvokableFactory::class, Test::class => TestFactory::class] ]); $test = $sc->get(Test::class);
服务管理器提供了一个名为InvokableFactory的特殊工厂来检索任何没有依赖项的类。例如,由于 stdClass 不依赖于任何其他类,因此可以使用 InvokableFactory 配置stdClass。
serviceManager $sc = new ServiceManager([ 'factories' => [stdClass::class => InvokableFactory::class] ]); $stdC = $sc->get(stdClass::class);
另一种无需实现FactoryInterface或使用InvokableFactory即可检索对象的方法是使用如下所示的内联方法。
$serviceManager = new ServiceManager([ 'factories' => [ stdClass::class => InvokableFactory::class, Test::class => function(ContainerInterface $container, $requestedName) { $dep = $container->get(stdClass::class); return new Test($dep); }, ], ]);
抽象工厂方法
有时,我们可能需要创建的对象只有在运行时才知道。这种情况可以使用AbstractFactoryInterface来处理,它派生自 FactoryInterface。
AbstractFactoryInterface 定义了一个方法来检查是否可以在请求的实例中创建对象。如果可以创建对象,它将使用 FactoryInterface 的__invoke方法创建对象并返回它。
AbstractFactoryInterface 的签名如下:
public function canCreate(ContainerInterface $container, $requestedName)
初始化方法
初始化方法是一种特殊的选项,用于为已创建的服务注入额外的依赖项。它实现了InitializerInterface,并且唯一可用方法的签名如下:
public function(ContainerInterface $container, $instance) function(ContainerInterface $container, $instance) { if (! $instance instanceof EventManagerAwareInterface) { return; } $instance->setEventManager($container->get(EventManager::class)); }
在上面的示例中,该方法检查实例是否为 EventManagerAwareInterface 类型。如果它是EventManagerAwareInterface类型,则设置事件管理器对象,否则不设置。由于该方法可能会也可能不会设置依赖项,因此它不可靠并会产生许多运行时问题。
委托工厂方法
Zend Framework 通过DelegatorFactoryInterface支持委托模式。它可以用来装饰服务。
此函数的签名如下:
public function __invoke(ContainerInterface $container, $name, callable $callback, array $options = null );
这里,$callback负责装饰服务实例。
延迟服务
延迟服务是在创建时不会完全初始化的服务之一。它们只是被引用,只有在真正需要时才会被初始化。最好的例子之一是数据库连接,它可能并非在所有地方都需要。它是一种昂贵的资源,并且创建过程也很耗时。Zend Framework 提供了派生自DelegatorFactoryInterface的LazyServiceFactory,它可以借助Delegator概念和一个第三方代理管理器(称为ocramius 代理管理器)来生成延迟服务。
插件管理器
插件管理器扩展了服务管理器,并提供附加功能,例如实例验证。Zend Framework 广泛使用插件管理器。
例如,所有验证服务都位于ValidationPluginManager下。
配置选项
服务管理器提供了一些选项来扩展服务管理器的功能。它们是shared、shared_by_default和aliases。正如我们前面讨论的,检索到的对象默认情况下在请求的对象之间共享,我们可以使用build()方法获取不同的对象。我们还可以使用shared选项来指定要共享的服务。shared_by_default与shared功能相同,只是它适用于所有服务。
$serviceManager = new ServiceManager([ 'factories' => [ stdClass::class => InvokableFactory::class ], 'shared' => [ stdClass::class => false // will not be shared ], 'shared_by_default' => false, // will not be shared and applies to all service ]);
aliases选项可用于为注册的服务提供替代名称。这既有优点也有缺点。从好的方面来说,我们可以为服务提供简短的替代名称。但与此同时,名称可能会脱离上下文并引入错误。
aliases' => ['std' => stdClass::class, 'standard' => 'std']