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 ;
2017-01-18 14:08:35 +00:00
use Symfony\Component\Workflow\SupportStrategy\ClassInstanceSupportStrategy ;
2016-12-04 22:08:15 +00:00
use Symfony\Component\Workflow\SupportStrategy\SupportStrategyInterface ;
2016-03-25 15:43:30 +00:00
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
/**
2016-12-04 22:08:15 +00:00
* @ param Workflow $workflow
* @ param string | SupportStrategyInterface $supportStrategy
2016-03-25 15:43:30 +00:00
*/
2016-12-04 22:08:15 +00:00
public function add ( Workflow $workflow , $supportStrategy )
2013-12-01 09:16:07 +00:00
{
2016-12-04 22:08:15 +00:00
if ( ! $supportStrategy instanceof SupportStrategyInterface ) {
@ trigger_error ( 'Support of class name string was deprecated after version 3.2 and won\'t work anymore in 4.0.' , E_USER_DEPRECATED );
2017-01-18 14:08:35 +00:00
$supportStrategy = new ClassInstanceSupportStrategy ( $supportStrategy );
2016-12-04 22:08:15 +00:00
}
$this -> workflows [] = array ( $workflow , $supportStrategy );
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-12-04 22:08:15 +00:00
foreach ( $this -> workflows as list ( $workflow , $supportStrategy )) {
if ( $this -> supports ( $workflow , $supportStrategy , $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-12-04 22:08:15 +00:00
private function supports ( Workflow $workflow , $supportStrategy , $subject , $workflowName )
2013-12-01 09:16:07 +00:00
{
2017-01-18 14:08:35 +00:00
if ( null !== $workflowName && $workflowName !== $workflow -> getName ()) {
2016-03-25 15:43:30 +00:00
return false ;
}
2017-01-18 14:08:35 +00:00
return $supportStrategy -> supports ( $workflow , $subject );
2013-12-01 09:16:07 +00:00
}
}