petrknap/php-servicemanager

此包已被弃用且不再维护。作者建议使用 symfony/dependency-injection 包。

PHP 服务管理器

v1.0.1 2017-11-04 10:59 UTC

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 文件 并将其文件解压缩到您的项目中。