petrknap / php-servicemanager
v1.0.1
2017-11-04 10:59 UTC
Requires
- php: >=5.5
- petrknap/php-singleton: ^1.0
- psr/container: ^1.0
Requires (Dev)
- phpunit/phpunit: ^4.8
This package is not auto-updated.
Last update: 2022-02-01 12:56:08 UTC
README
什么是服务定位器模式?
服务定位器模式 是一种在软件开发中使用的设计模式,用于 封装 获取具有强大抽象层的服务的相关过程。此模式使用一个称为 "服务定位器" 的中央注册表,根据请求返回执行特定任务所需的信息。-- 服务定位器模式 - 维基百科,自由的百科全书
为什么使用服务定位器?
因为它比不使用它更容易。你不相信我?看看这段代码
<?php // classes.php class MyDatabase { public function __construct($dsn, $user, $password) {/* ... */} } class MyWeb { public function __construct(MyDatabase $database) {/* ... */} } class MyBlog { public function __construct(MyWeb $web) {/* ... */} public function show($page) {/* ... */} } class MyAdmin { public function __construct(MyWeb $web) {/* ... */} public function show($page) {/* ... */} }
<?php // index.php require_once("classes.php"); $config = require("config.php"); $database = new MyDatabase($config["dsn"], $config["username"], $config["password"]); $web = new MyWeb($database); $blog = new MyBlog($web); $blog->show("homepage");
<?php // admin.php require_once("classes.php"); $config = require("config.php"); $database = new MyDatabase($config["dsn"], $config["username"], $config["password"]); $web = new MyWeb($database); $admin = new MyAdmin($web); $admin->show("dashboard");
现在有 使用服务定位器的相同代码
<?php // classes.php use PetrKnap\Php\ServiceManager\ServiceManager; use Psr\Container\ContainerInterface; class MyDatabase { public function __construct($dsn, $user, $password) {/* ... */} } class MyWeb { public function __construct(MyDatabase $database) {/* ... */} } class MyBlog { public function __construct(MyWeb $web) {/* ... */} public function show($page) {/* ... */} } class MyAdmin { public function __construct(MyWeb $web) {/* ... */} public function show($page) {/* ... */} } ServiceManager::setConfig([ "factories" => [ "MyDatabase" => function() { $config = require("config.php"); return new MyDatabase($config["dsn"], $config["username"], $config["password"]); }, "MyWeb" => function(ContainerInterface $container) { return new MyWeb($container->get("MyDatabase")); }, "MyBlog" => function(ContainerInterface $container) { return new MyBlog($container->get("MyWeb")); }, "MyAdmin" => function(ContainerInterface $container) { return new MyBlog($container->get("MyWeb")); } ] ]);
<?php // index.php use PetrKnap\Php\ServiceManager\ServiceManager; require_once("classes.php"); ServiceManager::getInstance()->get("MyBlog")->show("homepage");
<?php // admin.php use PetrKnap\Php\ServiceManager\ServiceManager; require_once("classes.php"); ServiceManager::getInstance()->get("MyAdmin")->show("dashboard");
php-servicemanager 的用法
服务管理器配置
<?php use PetrKnap\Php\ServiceManager\ConfigurationBuilder; use PetrKnap\Php\ServiceManager\ServiceManager; use Psr\Container\ContainerInterface; class MyCoreClass { /* ... */ } class MyClass { private $core; public function __construct(MyCoreClass $core) { $this->core = $core; } } $configBuilder = new ConfigurationBuilder(); $configBuilder->addInvokable("MyCoreClass", "MyCoreClass"); $configBuilder->setShared("MyCoreClass", true); $configBuilder->addFactory("MyClass", function(ContainerInterface $container) { return new MyClass($container->get("MyCoreClass")); }); ServiceManager::setConfig($configBuilder);
服务管理器使用
<?php use PetrKnap\Php\ServiceManager\ServiceManager; $serviceManager = ServiceManager::getInstance(); $myClass = $serviceManager->get("MyClass");
如何安装
运行 composer require petrknap/php-servicemanager
或手动将此 JSON 代码与您的项目 composer.json
文件合并并运行 composer install
。您可以使用 已发布的版本之一 而不是 dev-master
。
{ "require": { "petrknap/php-servicemanager": "dev-master" } }
或者,通过 git clone https://github.com/petrknap/php-servicemanager.git
手动克隆此存储库,或下载 此存储库的 ZIP 文件 并将其文件解压缩到您的项目中。