Skip to content

Commit

Permalink
add Application interface to allow cretting different implementations
Browse files Browse the repository at this point in the history
  • Loading branch information
kpicaza committed Nov 14, 2019
1 parent 100ef6d commit 9fe00ec
Show file tree
Hide file tree
Showing 7 changed files with 111 additions and 89 deletions.
81 changes: 10 additions & 71 deletions src/Application/Http/Application.php
Expand Up @@ -4,76 +4,15 @@

namespace Antidot\Application\Http;

use Antidot\Application\Http\Middleware\Pipeline;
use Antidot\Container\MiddlewareFactory;
use Zend\HttpHandlerRunner\RequestHandlerRunner;

class Application
interface Application
{
protected $pipeline;
protected $router;
protected $runner;
protected $middlewareFactory;
protected $routeFactory;

public function __construct(
RequestHandlerRunner $runner,
Pipeline $pipeline,
Router $router,
MiddlewareFactory $middlewareFactory,
RouteFactory $routeFactory
) {
$this->runner = $runner;
$this->pipeline = $pipeline;
$this->router = $router;
$this->middlewareFactory = $middlewareFactory;
$this->routeFactory = $routeFactory;
}

public function run(): void
{
$this->runner->run();
}

public function pipe(string $middlewareName): void
{
$this->pipeline->pipe($this->middlewareFactory->create($middlewareName));
}

public function get(string $uri, array $middleware, string $name): void
{
$this->route('GET', $uri, $middleware, $name);
}

public function post(string $uri, array $middleware, string $name): void
{
$this->route('POST', $uri, $middleware, $name);
}

public function patch(string $uri, array $middleware, string $name): void
{
$this->route('PATCH', $uri, $middleware, $name);
}

public function put(string $uri, array $middleware, string $name): void
{
$this->route('PUT', $uri, $middleware, $name);
}

public function delete(string $uri, array $middleware, string $name): void
{
$this->route('DELETE', $uri, $middleware, $name);
}

public function options(string $uri, array $middleware, string $name): void
{
$this->route('OPTIONS', $uri, $middleware, $name);
}

public function route(string $method, string $uri, array $middleware, string $name): void
{
$this->router->append(
$this->routeFactory->create([$method], $middleware, $uri, $name)
);
}
public function run(): void;
public function pipe(string $middlewareName): void;
public function get(string $uri, array $middleware, string $name): void;
public function post(string $uri, array $middleware, string $name): void;
public function patch(string $uri, array $middleware, string $name): void;
public function put(string $uri, array $middleware, string $name): void;
public function delete(string $uri, array $middleware, string $name): void;
public function options(string $uri, array $middleware, string $name): void;
public function route(string $method, string $uri, array $middleware, string $name): void;
}
79 changes: 79 additions & 0 deletions src/Application/Http/WebServerApplication.php
@@ -0,0 +1,79 @@
<?php

declare(strict_types=1);

namespace Antidot\Application\Http;

use Antidot\Application\Http\Middleware\Pipeline;
use Antidot\Container\MiddlewareFactory;
use Zend\HttpHandlerRunner\RequestHandlerRunner;

class WebServerApplication implements Application
{
protected $pipeline;
protected $router;
protected $runner;
protected $middlewareFactory;
protected $routeFactory;

public function __construct(
RequestHandlerRunner $runner,
Pipeline $pipeline,
Router $router,
MiddlewareFactory $middlewareFactory,
RouteFactory $routeFactory
) {
$this->runner = $runner;
$this->pipeline = $pipeline;
$this->router = $router;
$this->middlewareFactory = $middlewareFactory;
$this->routeFactory = $routeFactory;
}

public function run(): void
{
$this->runner->run();
}

public function pipe(string $middlewareName): void
{
$this->pipeline->pipe($this->middlewareFactory->create($middlewareName));
}

public function get(string $uri, array $middleware, string $name): void
{
$this->route('GET', $uri, $middleware, $name);
}

public function post(string $uri, array $middleware, string $name): void
{
$this->route('POST', $uri, $middleware, $name);
}

public function patch(string $uri, array $middleware, string $name): void
{
$this->route('PATCH', $uri, $middleware, $name);
}

public function put(string $uri, array $middleware, string $name): void
{
$this->route('PUT', $uri, $middleware, $name);
}

public function delete(string $uri, array $middleware, string $name): void
{
$this->route('DELETE', $uri, $middleware, $name);
}

public function options(string $uri, array $middleware, string $name): void
{
$this->route('OPTIONS', $uri, $middleware, $name);
}

public function route(string $method, string $uri, array $middleware, string $name): void
{
$this->router->append(
$this->routeFactory->create([$method], $middleware, $uri, $name)
);
}
}
3 changes: 2 additions & 1 deletion src/Container/ApplicationFactory.php
Expand Up @@ -5,6 +5,7 @@
namespace Antidot\Container;

use Antidot\Application\Http\Application;
use Antidot\Application\Http\WebServerApplication;
use Antidot\Application\Http\Middleware\MiddlewarePipeline;
use Antidot\Application\Http\Middleware\Pipeline;
use Antidot\Application\Http\Response\ErrorResponseGenerator;
Expand All @@ -21,7 +22,7 @@ public function __invoke(ContainerInterface $container): Application
{
$pipeline = new MiddlewarePipeline(new SplQueue());
$runner = $this->getRunner($container, $pipeline);
return new Application(
return new WebServerApplication(
$runner,
$pipeline,
$container->get(Router::class),
Expand Down
1 change: 1 addition & 0 deletions src/Container/Config/ConfigProvider.php
Expand Up @@ -5,6 +5,7 @@
namespace Antidot\Container\Config;

use Antidot\Application\Http\Application;
use Antidot\Application\Http\WebServerApplication;
use Antidot\Application\Http\Middleware\ErrorMiddleware;
use Antidot\Application\Http\Middleware\RouteDispatcherMiddleware;
use Antidot\Application\Http\Middleware\RouteNotFoundMiddleware;
Expand Down
5 changes: 3 additions & 2 deletions test/Application/Http/ApplicationTest.php
Expand Up @@ -5,6 +5,7 @@
namespace AntidotTest\Application\Http;

use Antidot\Application\Http\Application;
use Antidot\Application\Http\WebServerApplication;
use Antidot\Application\Http\Middleware\LazyLoadingMiddleware;
use Antidot\Application\Http\Middleware\Pipeline;
use Antidot\Application\Http\Route;
Expand All @@ -26,7 +27,7 @@ class ApplicationTest extends TestCase
private $pipeline;
/** @var Router|MockObject */
private $router;
/** @var Application */
/** @var WebServerApplication */
private $app;
/** @var array */
private $routeData;
Expand Down Expand Up @@ -137,7 +138,7 @@ private function givenARouteFactory(): void

private function whenApplicationConstructorIsCalled(): void
{
$this->app = new Application(
$this->app = new WebServerApplication(
$this->runner,
$this->pipeline,
$this->router,
Expand Down
3 changes: 2 additions & 1 deletion test/Container/ApplicationFactoryTest.php
Expand Up @@ -5,6 +5,7 @@
namespace AntidotTest\Container\Config;

use Antidot\Application\Http\Application;
use Antidot\Application\Http\WebServerApplication;
use Antidot\Application\Http\Response\ErrorResponseGenerator;
use Antidot\Application\Http\RouteFactory;
use Antidot\Application\Http\Router;
Expand All @@ -20,7 +21,7 @@ class ApplicationFactoryTest extends TestCase
{
/** @var MockObject|ContainerInterface */
private $container;
/** @var Application */
/** @var WebServerApplication */
private $application;

public function testItShouldCreateServerRequestFromServerGlobals(): void
Expand Down
28 changes: 14 additions & 14 deletions test/Container/Config/ContainerConfigTest.php
Expand Up @@ -4,7 +4,7 @@

namespace AntidotTest\Container\Config;

use Antidot\Application\Http\Application;
use Antidot\Application\Http\WebServerApplication;
use Antidot\Application\Http\Middleware\Pipeline;
use Antidot\Container\Config\ContainerConfig;
use Antidot\Container\EmitterFactory;
Expand Down Expand Up @@ -357,8 +357,8 @@ private function havingAContainerWithConditionalConfig(): void
$this->config = [
'dependencies' => [
'conditionals' => [
Application::class => [
'class' => Application::class,
WebServerApplication::class => [
'class' => WebServerApplication::class,
'arguments' => $this->arguments,
],
],
Expand All @@ -375,7 +375,7 @@ private function thenContainerShouldHaveConfiguredConditionalDependencies(): voi
$this->container
->expects($this->exactly(2))
->method('has')
->with($this->logicalOr(RequestHandlerRunner::class, Application::class))
->with($this->logicalOr(RequestHandlerRunner::class, WebServerApplication::class))
->willReturn(true);
$this->container
->expects($this->at(2))
Expand All @@ -393,16 +393,16 @@ private function thenContainerShouldHaveConfiguredConditionalNonExistingDependen
$this->container
->expects($this->exactly(2))
->method('has')
->with($this->logicalOr(RequestHandlerRunner::class, Application::class))
->with($this->logicalOr(RequestHandlerRunner::class, WebServerApplication::class))
->willReturn(false);
$this->container
->expects($this->exactly(2))
->method('lazyNew')
->with($this->logicalOr(RequestHandlerRunner::class, Application::class));
->with($this->logicalOr(RequestHandlerRunner::class, WebServerApplication::class));
$this->container
->expects($this->exactly(3))
->method('lazyGet')
->with($this->logicalOr(RequestHandlerRunner::class, Application::class));
->with($this->logicalOr(RequestHandlerRunner::class, WebServerApplication::class));
}

private function havingAContainerWithConditionalArrayParamsConfig(): void
Expand All @@ -413,8 +413,8 @@ private function havingAContainerWithConditionalArrayParamsConfig(): void
$this->config = [
'dependencies' => [
'conditionals' => [
Application::class => [
'class' => Application::class,
WebServerApplication::class => [
'class' => WebServerApplication::class,
'arguments' => $this->arguments,
],
],
Expand All @@ -424,27 +424,27 @@ private function havingAContainerWithConditionalArrayParamsConfig(): void

private function thenContainerShouldHaveConfiguredConditionalArrayParamsDependencies(): void
{
$application = $this->createMock(Application::class);
$application = $this->createMock(WebServerApplication::class);
$this->container
->expects($this->exactly(2))
->method('set')
->with(
$this->logicalOr('config', Application::class),
$this->logicalOr('config', WebServerApplication::class),
$this->logicalOr(new ArrayObject($this->config, ArrayObject::ARRAY_AS_PROPS), $application)
);
$this->container
->expects($this->exactly(1))
->method('lazyNew')
->with(Application::class, $this->arguments)
->with(WebServerApplication::class, $this->arguments)
->willReturn($application);
$this->container
->expects($this->exactly(1))
->method('lazyGet')
->with(Application::class);
->with(WebServerApplication::class);
$this->container
->expects($this->exactly(1))
->method('has')
->with(Application::class)
->with(WebServerApplication::class)
->willReturn(true);

}
Expand Down

0 comments on commit 9fe00ec

Please sign in to comment.