for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
<?php
namespace Samurai\Module;
/**
* Class ModulesSorter
* @package Samurai\module
* @author Raphaël Lefebvre <[email protected]>
*/
class ModulesSorter
{
* @var Module[]
private $initial;
private $result;
* @param Modules $modules
* @return Modules
public function sort(Modules $modules)
$this->result = [];
$this->initial = $modules->getArrayCopy();
$this->run();
return new Modules($this->result);
}
*
private function run()
while ($this->initial) {
if (!$this->sortOnce()) {
throw new \RuntimeException(
sprintf(
'Modules sort not possible. Maybe circular dependencies between these modules: %s.',
implode(', ', array_keys($this->initial))
)
);
};
* @return bool
private function sortOnce()
$result = false;
foreach ($this->initial as $name => $module) {
if ($this->canBeAdded($module)) {
$this->result[$name] = $module;
unset($this->initial[$name]);
$result = true;
return $result;
* @param Module $module
private function canBeAdded($module)
if ($module->getDependencies()->count()) {
return $this->areAllAlreadyPresent($module->getDependencies());
return true;
* @param Modules $dependencies
private function areAllAlreadyPresent(Modules $dependencies)
$count = 0;
foreach($dependencies as $iDependency){
foreach($this->result as $rDependency){
if($iDependency->getPackage() === $rDependency->getPackage()){
$count++;
break;
return $count === count($dependencies);