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 ;
2016-12-04 22:08:15 +00:00
use Symfony\Component\Workflow\SupportStrategy\SupportStrategyInterface ;
2017-10-30 06:24:47 +00:00
use Symfony\Component\Workflow\SupportStrategy\WorkflowSupportStrategyInterface ;
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
{
2019-01-16 18:24:45 +00:00
private $workflows = [];
2013-12-01 09:16:07 +00:00
2016-03-25 15:43:30 +00:00
/**
2017-05-19 09:19:00 +01:00
* @ param SupportStrategyInterface $supportStrategy
2017-10-30 06:24:47 +00:00
*
2018-02-19 11:42:56 +00:00
* @ deprecated since Symfony 4.1 , use addWorkflow () instead
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
{
2018-07-06 12:18:00 +01:00
@ trigger_error ( sprintf ( 'The "%s()" method is deprecated since Symfony 4.1. Use addWorkflow() instead.' , __METHOD__ ), E_USER_DEPRECATED );
2019-01-16 18:24:45 +00:00
$this -> workflows [] = [ $workflow , $supportStrategy ];
2017-10-30 06:24:47 +00:00
}
2016-12-04 22:08:15 +00:00
2017-10-30 06:24:47 +00:00
public function addWorkflow ( WorkflowInterface $workflow , WorkflowSupportStrategyInterface $supportStrategy )
{
2019-01-16 18:24:45 +00:00
$this -> workflows [] = [ $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 ) {
2018-07-26 09:45:46 +01:00
throw new InvalidArgumentException ( sprintf ( 'Unable to find a workflow for class "%s".' , \get_class ( $subject )));
2016-03-25 15:43:30 +00:00
}
return $matched ;
2013-12-01 09:16:07 +00:00
}
2018-03-23 14:04:31 +00:00
/**
* @ param object $subject
*
* @ return Workflow []
*/
public function all ( $subject ) : array
{
2019-01-16 18:24:45 +00:00
$matched = [];
2018-03-23 14:04:31 +00:00
foreach ( $this -> workflows as list ( $workflow , $supportStrategy )) {
if ( $supportStrategy -> supports ( $workflow , $subject )) {
$matched [] = $workflow ;
}
}
return $matched ;
}
2017-10-30 06:24:47 +00:00
private function supports ( WorkflowInterface $workflow , $supportStrategy , $subject , $workflowName ) : bool
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
}
}