Skip to content

Commit

Permalink
Switch container for application in resolve
Browse files Browse the repository at this point in the history
attribute
  • Loading branch information
ppelgrims committed Feb 7, 2025
1 parent a50426a commit 080e74e
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 31 deletions.
6 changes: 3 additions & 3 deletions src/Laravel/Attributes/Resolve.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

use Attribute;
use Closure;
use Illuminate\Container\Container;
use Illuminate\Foundation\Application;

/**
* @deprecated 8.3
Expand All @@ -33,7 +33,7 @@ public function __construct(
$this->using = $using ? $using(...) : null;
}

public function __invoke(string $abstract, Container $app): mixed
public function __invoke(string $abstract, Application $app): mixed
{
// If the property is set to be resolved by alias, we should use the alias instead of the abstract
// classFQN. This is useful when working with fakes that may be bound to multiple abstractions...
Expand Down Expand Up @@ -74,7 +74,7 @@ public function __invoke(string $abstract, Container $app): mixed
return $instance;
}

private function addConditionalBindingsToAbstract(string $abstract, Container $app): void
private function addConditionalBindingsToAbstract(string $abstract, Application $app): void
{
foreach ($this->with as $binding => $implementation) {
$app->when($abstract)
Expand Down
47 changes: 19 additions & 28 deletions src/Laravel/Attributes/ResolveTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,64 +8,58 @@
use Craftzing\TestBench\Laravel\Attributes\TestFixture\FakeService;
use Craftzing\TestBench\Laravel\Attributes\TestFixture\Service;
use Craftzing\TestBench\Laravel\Attributes\TestFixture\ServiceDecorator;
use Illuminate\Container\Container;
use Craftzing\TestBench\Laravel\TestCase;
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\TestCase;

final class ResolveTest extends TestCase
{
#[Test]
public function itCanReturnTheInstance(): void
{
$container = new Container();
$container->bind(Service::class, FakeService::class);
$this->app->bind(Service::class, FakeService::class);

$resolved = (new Resolve())(Service::class, $container);
$resolved = (new Resolve())(Service::class, $this->app);

$this->assertInstanceOf(FakeService::class, $resolved);
}

#[Test]
public function itCanSwapAnImplementation(): void
{
$container = new Container();
$container->bind(Service::class, FakeService::class);
$this->app->bind(Service::class, FakeService::class);

$resolved = (new Resolve(swap: Service::class))(AlternateFakeService::class, $container);
$resolved = (new Resolve(swap: Service::class))(AlternateFakeService::class, $this->app);

$this->assertInstanceOf(AlternateFakeService::class, $resolved);
}

#[Test]
public function itCanResolveAnImplementationWithoutDecorators(): void
{
$container = new Container();
$container->bind(Service::class, FakeService::class);
$container->extend(Service::class, fn (Service $service): Service => new ServiceDecorator($service));
$this->app->bind(Service::class, FakeService::class);
$this->app->extend(Service::class, fn (Service $service): Service => new ServiceDecorator($service));

$resolved = (new Resolve(withoutDecorators: true))(Service::class, $container);
$resolved = (new Resolve(withoutDecorators: true))(Service::class, $this->app);

$this->assertInstanceOf(FakeService::class, $resolved);
}

#[Test]
public function itCanResolveTheImplementationByAliasNameInsteadOfFQN(): void
{
$container = new Container();
$container->bind('service', FakeService::class);
$this->app->bind('service', FakeService::class);

$resolved = (new Resolve(alias: 'service'))(Service::class, $container);
$resolved = (new Resolve(alias: 'service'))(Service::class, $this->app);

$this->assertInstanceOf(FakeService::class, $resolved);
}

#[Test]
public function itCanDropTheBindingOfTheImplementation(): void
{
$container = new Container();
$container->bind(FakeService::class, fn (): Service => new FakeService(1));
$this->app->bind(FakeService::class, fn (): Service => new FakeService(1));

$resolved = (new Resolve(unbind: true))(FakeService::class, $container);
$resolved = (new Resolve(unbind: true))(FakeService::class, $this->app);

$this->assertInstanceOf(FakeService::class, $resolved);
$this->assertNull($resolved->value);
Expand All @@ -75,34 +69,31 @@ public function itCanDropTheBindingOfTheImplementation(): void
public function itCanResolveTheImplementationWithParameters(): void
{
$expectedValue = 1;
$container = new Container();
$container->bind(Service::class, FakeService::class);
$this->app->bind(Service::class, FakeService::class);

$resolved = (new Resolve(with: ['$value' => $expectedValue]))(FakeService::class, $container);
$resolved = (new Resolve(with: ['$value' => $expectedValue]))(FakeService::class, $this->app);

$this->assertEquals($expectedValue, $resolved->value);
}

#[Test]
public function itCanRebindAnImplementationAsSingleton(): void
{
$container = new Container();
$container->bind(FakeService::class, FakeService::class);
$this->app->bind(FakeService::class, FakeService::class);

$firstTimeResolved = (new Resolve(singleton: true))(FakeService::class, $container);
$secondTimeResolved = (new Resolve())(FakeService::class, $container);
$firstTimeResolved = (new Resolve(singleton: true))(FakeService::class, $this->app);
$secondTimeResolved = (new Resolve())(FakeService::class, $this->app);

$this->assertSame($firstTimeResolved, $secondTimeResolved);
}

#[Test]
public function itCanResolveTheImplementationUsingACallback(): void
{
$container = new Container();
$container->bind(Service::class, FakeService::class);
$this->app->bind(Service::class, FakeService::class);
$callback = fn (Service $service): Service => new ServiceDecorator($service);

$resolved = (new Resolve(using: $callback))(Service::class, $container);
$resolved = (new Resolve(using: $callback))(Service::class, $this->app);

$this->assertInstanceOf(ServiceDecorator::class, $resolved);
}
Expand Down

0 comments on commit 080e74e

Please sign in to comment.