Skip to content

Commit

Permalink
[5.7] Bug fix for app()->call() (#26852)
Browse files Browse the repository at this point in the history
* Update BoundMethod.php

Bug fix for app()->call('class@method');

fixes:
#22687

* Update ContainerTest.php

Added tests for app()->call() with default values in the called method

* Update ContainerTest.php

fixes style-ci issues

* fixes the tests

Fixes the tests

* Fixes the bug caught by tests

* more tests to be more sure

* Fixes style-CI issue

* better tests + typo fix

* Passes the most recent test (defaultOnlyC)

* More tests covering more cases

* Adds more tests

Adds more tests

* Update ContainerTest.php

Fix Style-ci
  • Loading branch information
imanghafoori1 authored and taylorotwell committed Dec 17, 2018
1 parent 3913c10 commit 881be81
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/Illuminate/Container/BoundMethod.php
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ protected static function getMethodDependencies($container, $callback, array $pa
static::addDependencyForCallParameter($container, $parameter, $parameters, $dependencies);
}

return array_merge($dependencies, $parameters);
return $parameters + $dependencies;
}

/**
Expand Down Expand Up @@ -162,6 +162,8 @@ protected static function addDependencyForCallParameter($container, $parameter,
$dependencies[] = $container->make($parameter->getClass()->name);
} elseif ($parameter->isDefaultValueAvailable()) {
$dependencies[] = $parameter->getDefaultValue();
} else {
$dependencies[] = null;
}
}

Expand Down
94 changes: 94 additions & 0 deletions tests/Container/ContainerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -516,6 +516,77 @@ public function testCallWithDependencies()
$this->assertEquals('taylor', $result[1]);
}

public function testWithDefaultParametersIndexedArraySyntax()
{
$container = new Container;
$result = $container->call(ContainerTestDefaultyParams::class.'@defaulty', ['foo', 'bar']);

$this->assertEquals(['foo', 'bar', 'default c'], $result);

$container = new Container;
$result = $container->call(ContainerTestDefaultyParams::class.'@defaulty', ['foo', 'bar', 'baz']);

$this->assertEquals(['foo', 'bar', 'baz'], $result);

$container = new Container;
$result = $container->call(ContainerTestDefaultyParams::class.'@defaulty');

$this->assertEquals(['default a', 'default b', 'default c'], $result);

$container = new Container;
$result = $container->call(ContainerTestDefaultyParams::class.'@defaultyBandC', ['foo', 'bar']);

$this->assertEquals(['foo', 'bar', 'default c'], $result);

$container = new Container;
$result = $container->call(ContainerTestDefaultyParams::class.'@defaultyBandC', ['foo']);

$this->assertEquals(['foo', 'default b', 'default c'], $result);

$container = new Container;
$result = $container->call(ContainerTestDefaultyParams::class.'@defaultyOnlyC', ['foo', 'bar']);

$this->assertEquals(['foo', 'bar', 'default c'], $result);

$container = new Container;
$result = $container->call(ContainerTestDefaultyParams::class.'@noDefault', ['foo', 'bar', 'baz']);

$this->assertEquals(['foo', 'bar', 'baz'], $result);
}

public function testWithDefaultParametersAssociativeSyntax()
{
$container = new Container;
$result = $container->call(ContainerTestDefaultyParams::class.'@defaulty', ['a' => 'foo', 'b' => 'bar']);

$this->assertEquals(['foo', 'bar', 'default c'], $result);

$container = new Container;
$result = $container->call(ContainerTestDefaultyParams::class.'@defaulty', ['a' => 'foo', 'b' => 'bar', 'c' => 'baz']);

$this->assertEquals(['foo', 'bar', 'baz'], $result);

$container = new Container;
$result = $container->call(ContainerTestDefaultyParams::class.'@defaultyBandC', ['a' => 'foo', 'b' => 'bar']);

$this->assertEquals(['foo', 'bar', 'default c'], $result);

$container = new Container;
$result = $container->call(ContainerTestDefaultyParams::class.'@defaultyBandC', ['a' => 'foo']);

$this->assertEquals(['foo', 'default b', 'default c'], $result);

$container = new Container;
$result = $container->call(ContainerTestDefaultyParams::class.'@defaultyOnlyC', ['a' => 'foo', 'b' => 'bar']);

$this->assertEquals(['foo', 'bar', 'default c'], $result);

$container = new Container;
$result = $container->call(ContainerTestDefaultyParams::class.'@noDefault', ['a' => 'foo', 'b' => 'bar', 'c' => 'baz']);

$this->assertEquals(['foo', 'bar', 'baz'], $result);
}

/**
* @expectedException \ReflectionException
* @expectedExceptionMessage Function ContainerTestCallStub() does not exist
Expand Down Expand Up @@ -1271,3 +1342,26 @@ public function __construct()
static::$instantiations++;
}
}

class ContainerTestDefaultyParams
{
public function defaulty($a = 'default a', $b = 'default b', $c = 'default c')
{
return func_get_args();
}

public function defaultyBandC($a, $b = 'default b', $c = 'default c')
{
return func_get_args();
}

public function defaultyOnlyC($a, $b, $c = 'default c')
{
return func_get_args();
}

public function noDefault($a, $b, $c)
{
return func_get_args();
}
}

0 comments on commit 881be81

Please sign in to comment.