quietfrog/dependency-graph

PHP 的依赖关系图

0.5.0 2014-08-24 13:29 UTC

This package is auto-updated.

Last update: 2024-09-14 08:50:49 UTC


README

Build Status Coverage Status

这个库是从 https://github.com/MikeRoetgers/dependency-graph 分支出来的,以下是一些改动

  • DependencyManager 类重命名为 Graph
  • 将基本命名空间重命名为 QuietFrog
  • 隐藏了一些类(例如 Operation),以便使库更通用。
  • 移除了标签处理

文档

这是一个简单的依赖关系图(有向无环图)的实现。定义服务及其之间的依赖关系。该图跟踪所有依赖关系,并给出服务可以执行的正确顺序。这对于处理长时间运行的任务特别方便,如果想要识别哪些服务可以并行执行。

示例

$service1 = new YourService1();
$service2 = new YourService2();
$service3 = new YourService3();
$service4 = new YourService4();

$graph = new Graph();
$graph->add($service1)->add($service2)->add($service3)->add($service4);

$graph->addDependency($service1, $service2);
$graph->addDependency($service1, $service3);
$graph->addDependency($service2, $service4);
$graph->addDependency($service3, $service4);

这个定义产生了以下图

      1
    /  \
   2    3
    \  /
     4

询问图可以解决哪些依赖关系。当服务执行后,将其标记为已解决,并询问新的可用服务。

$services = $graph->getUnresolvedDependencies(); // $service1
  $service1->doSomething();
$graph->markAsResolved($service1);
$services = $graph->getUnresolvedDependencies(); // $service2 and $service3
  $service3->doSomething();
$graph->markAsResolved($service3);
$services = $graph->getUnresolvedDependencies(); // $service2
  $service2->doSomething();
$graph->markAsResolved($service2);
$services = $graph->getUnresolvedDependencies(); // $service4
  $service4->doSomething();

更复杂的图也是可能的。

  1     2
  |    / \
  3   4   5
   \ /    |
    6     7
    |
    8

无环性

图是无环的,这意味着类似以下情况是不允许的

$service1 = new YourService2();
$service2 = new YourService2();
$service3 = new YourService3();

$graph = new Graph();
$graph->add($service1)->add($service2)->add($service3);

$graph->addDependency($service1, $service2);
$graph->addDependency($service2, $service3);
$graph->addDependency($service3, $service1);
   1
  / \
 2 – 3

初始化图时将检测到循环。将抛出 CircularDependencyDetectedException 异常。