Skip to content

[5.7] Bug fix for app()->call() #26852

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Dec 17, 2018
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();
}
}