diff --git a/lib/Predis.php b/lib/Predis.php index 6887e9b2..22939fff 100644 --- a/lib/Predis.php +++ b/lib/Predis.php @@ -929,8 +929,15 @@ class MultiExecBlock { "Cannot invoke 'execute' or 'exec' inside an active client transaction block" ); } - if ($block && !is_callable($block)) { - throw new \InvalidArgumentException('Argument passed must be a callable object'); + if ($block) { + if (!is_callable($block)) { + throw new \InvalidArgumentException('Argument passed must be a callable object'); + } + if (count($this->_commands) > 0) { + throw new ClientException( + 'Cannot execute a transaction block after using fluent interface' + ); + } } if (isset($this->_options['retry']) && !isset($block)) { $this->discard(); diff --git a/test/PredisClientFeatures.php b/test/PredisClientFeatures.php index 28f6ac78..d3331bd8 100644 --- a/test/PredisClientFeatures.php +++ b/test/PredisClientFeatures.php @@ -524,6 +524,14 @@ class PredisClientFeaturesTestSuite extends PHPUnit_Framework_TestCase { $this->assertEquals('bar', $replies[2]); } + /** + * @expectedException Predis\ClientException + */ + function testMultiExecBlock_CannotMixFluentInterfaceAndAnonymousBlock() { + $emptyBlock = function($tx) { }; + $tx = RC::getConnection()->multiExec()->get('foo')->execute($emptyBlock); + } + function testMultiExecBlock_EmptyCallableBlock() { $client = RC::getConnection(); $client->flushdb();