Skip to content

Commit

Permalink
Merge pull request #662 from cakephp/2.next-more-dic
Browse files Browse the repository at this point in the history
2.next: add ability to set custom container instance
  • Loading branch information
markstory committed Jan 29, 2024
2 parents a5dc587 + a258721 commit 329f9de
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 2 deletions.
19 changes: 17 additions & 2 deletions src/Middleware/AuthenticationMiddleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
use Authentication\Authenticator\StatelessInterface;
use Authentication\Authenticator\UnauthenticatedException;
use Cake\Core\ContainerApplicationInterface;
use Cake\Core\ContainerInterface;
use Cake\Core\InstanceConfigTrait;
use InvalidArgumentException;
use Laminas\Diactoros\Response;
Expand Down Expand Up @@ -63,15 +64,26 @@ class AuthenticationMiddleware implements MiddlewareInterface
*/
protected $subject;

/**
* The container instance from the application
*
* @var \Cake\Core\ContainerInterface|null
*/
protected $container;

/**
* Constructor
*
* @param \Authentication\AuthenticationServiceInterface|\Authentication\AuthenticationServiceProviderInterface $subject Authentication service or application instance.
* @param array $config Array of configuration settings.
* @param \Cake\Core\ContainerInterface|null $container The container instance from the application
* @throws \InvalidArgumentException When invalid subject has been passed.
*/
public function __construct($subject, $config = [])
{
public function __construct(
$subject,
$config = [],
?ContainerInterface $container = null
) {
$this->setConfig($config);

if (
Expand All @@ -89,6 +101,7 @@ public function __construct($subject, $config = [])
}

$this->subject = $subject;
$this->container = $container;
}

/**
Expand All @@ -105,6 +118,8 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
if ($this->subject instanceof ContainerApplicationInterface) {
$container = $this->subject->getContainer();
$container->add(AuthenticationService::class, $service);
} elseif ($this->container) {
$this->container->add(AuthenticationService::class, $service);
}

try {
Expand Down
22 changes: 22 additions & 0 deletions tests/TestCase/Middleware/AuthenticationMiddlewareTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
use Authentication\IdentityInterface;
use Authentication\Middleware\AuthenticationMiddleware;
use Authentication\Test\TestCase\AuthenticationTestCase as TestCase;
use Cake\Core\Container;
use Cake\Core\TestSuite\ContainerStubTrait;
use Cake\Http\Response;
use Cake\Http\ServerRequestFactory;
Expand Down Expand Up @@ -772,4 +773,25 @@ public function testMiddlewareInjectsServiceIntoDIC(): void
$container = $this->application->getContainer();
$this->assertInstanceOf(AuthenticationService::class, $container->get(AuthenticationService::class));
}

public function testMiddlewareInjectsServiceIntoDICCustomContainerInstance(): void
{
$request = ServerRequestFactory::fromGlobals(
['REQUEST_URI' => '/testpath'],
[],
['username' => 'mariano', 'password' => 'password']
);
$handler = new TestRequestHandler();

$provider = $this->createMock(AuthenticationServiceProviderInterface::class);
$provider
->method('getAuthenticationService')
->willReturn($this->service);
$container = new Container();

$middleware = new AuthenticationMiddleware($provider, [], $container);
$middleware->process($request, $handler);

$this->assertInstanceOf(AuthenticationService::class, $container->get(AuthenticationService::class));
}
}

0 comments on commit 329f9de

Please sign in to comment.