2013-12-01 09:16:07 +00:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\Workflow ;
2016-03-25 15:43:30 +00:00
use Symfony\Component\Workflow\Exception\InvalidArgumentException ;
2013-12-01 09:16:07 +00:00
/**
* @ author Fabien Potencier < fabien @ symfony . com >
2016-03-25 15:43:30 +00:00
* @ author Grégoire Pineau < lyrixx @ lyrixx . info >
2013-12-01 09:16:07 +00:00
*/
class Registry
{
private $workflows = array ();
2016-03-25 15:43:30 +00:00
/**
* @ param Workflow $workflow
2016-06-26 08:31:53 +01:00
* @ param string $className
2016-03-25 15:43:30 +00:00
*/
2016-06-26 08:31:53 +01:00
public function add ( Workflow $workflow , $className )
2013-12-01 09:16:07 +00:00
{
2016-06-26 08:31:53 +01:00
$this -> workflows [] = array ( $workflow , $className );
2013-12-01 09:16:07 +00:00
}
2016-12-06 13:57:19 +00:00
/**
* @ param object $subject
* @ param string | null $workflowName
*
* @ return Workflow
*/
2016-03-25 15:43:30 +00:00
public function get ( $subject , $workflowName = null )
2013-12-01 09:16:07 +00:00
{
2016-03-25 15:43:30 +00:00
$matched = null ;
2016-06-26 08:31:53 +01:00
foreach ( $this -> workflows as list ( $workflow , $className )) {
if ( $this -> supports ( $workflow , $className , $subject , $workflowName )) {
2016-03-25 15:43:30 +00:00
if ( $matched ) {
throw new InvalidArgumentException ( 'At least two workflows match this subject. Set a different name on each and use the second (name) argument of this method.' );
}
$matched = $workflow ;
}
}
if ( ! $matched ) {
throw new InvalidArgumentException ( sprintf ( 'Unable to find a workflow for class "%s".' , get_class ( $subject )));
}
return $matched ;
2013-12-01 09:16:07 +00:00
}
2016-06-26 08:31:53 +01:00
private function supports ( Workflow $workflow , $className , $subject , $name )
2013-12-01 09:16:07 +00:00
{
2016-06-26 08:31:53 +01:00
if ( ! $subject instanceof $className ) {
2016-03-25 15:43:30 +00:00
return false ;
}
if ( null === $name ) {
return true ;
2013-12-01 09:16:07 +00:00
}
2016-03-25 15:43:30 +00:00
return $name === $workflow -> getName ();
2013-12-01 09:16:07 +00:00
}
}