Skip to content

Commit

Permalink
Revert "Revert "Global app middlewares and multiple action methods""
Browse files Browse the repository at this point in the history
  • Loading branch information
Petr Hejna authored and Petr Hejna committed Oct 1, 2018
1 parent 3f961ed commit 24cc28c
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 9 deletions.
9 changes: 7 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ slimApi: # Configure it
```
### First API enpoint
### First API endpoint
Now let's say you want to make a REST endpoint creating channels, `[POST] /new-api/2.0/channels`

You need to define in `parameters.api` section in `config.neon`.
Expand Down Expand Up @@ -71,7 +71,12 @@ parameters:
- App\SomeOtherMiddleware # last in row
- App\UsuallyRequestDataValidationMiddleware # second in row
- App\SomeAuthMiddleware # this one is called first
globalMiddlewares:
- App\SomeGlobalMiddleware # this is called for each route, before route middlewares
appMiddlewares:
- App\SomeAppMiddleware # this is called for each request
```

You can also reference the named service by it's name.
Expand Down
52 changes: 46 additions & 6 deletions src/SlimApplicationFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ final class SlimApplicationFactory
*/
private $container;

/**
* @var Middleware[]
*/
private $globalMiddlewares;

/**
* @param array $configuration
* @param Container $container
Expand All @@ -30,6 +35,7 @@ public function __construct(array $configuration, Container $container)
{
$this->configuration = $configuration;
$this->container = $container;
$this->globalMiddlewares = [];
}

/**
Expand All @@ -41,6 +47,8 @@ public function create()

$configuration = $this->getConfiguration($this->configuration['apiDefinitionKey']);

$this->registerGlobalMiddlewares($app, $configuration);

foreach ($configuration['routes'] as $apiName => $api) {
$this->registerApis($app, $api, $apiName);
}
Expand All @@ -55,6 +63,12 @@ public function create()
$this->registerHandlers($app, $configuration['handlers']);
}

if (isset($configuration['appMiddlewares'])) {
foreach ($configuration['appMiddlewares'] as $globalMiddleware) {
$this->registerAppMiddleware($app, $globalMiddleware);
}
}

return $app;

}
Expand Down Expand Up @@ -146,7 +160,9 @@ private function registerHandlers(SlimApp $app, array $handlers)
*/
private function registerServiceIntoContainer(SlimApp $app, $serviceName)
{
$app->getContainer()[$serviceName] = $this->getServiceProvider($serviceName);
if (!$app->getContainer()->has($serviceName)) {
$app->getContainer()[$serviceName] = $this->getServiceProvider($serviceName);
}
}

/**
Expand Down Expand Up @@ -212,15 +228,15 @@ private function registerInvokableActionRoutes(SlimApp $app, array $routeData, $

if (isset($config['middleware']) && count($config['middleware']) > 0) {
foreach ($config['middleware'] as $middleware) {
$container = $app->getContainer();

if (!$container->has($middleware)) {
$this->registerServiceIntoContainer($app, $middleware);
}
$this->registerServiceIntoContainer($app, $middleware);

$routeToAdd->add($middleware);
}
}

foreach ($this->globalMiddlewares as $globalMiddleware) {
$routeToAdd->add($globalMiddleware);
}
}
}

Expand All @@ -235,4 +251,28 @@ private function createUrlPattern($apiName, $version, $routeName)
return sprintf('/%s/%s%s', $apiName, $version, $routeName);
}

/**
* @param SlimApp $app
* @param string $middleware
*/
private function registerAppMiddleware(SlimApp $app, $middleware)
{
$this->registerServiceIntoContainer($app, $middleware);

$app->add($middleware);
}

/**
* @param SlimApp $app
* @param array $configuration
*/
private function registerGlobalMiddlewares(SlimApp $app, $configuration)
{
if (isset($configuration['globalMiddlewares']) && count($configuration['globalMiddlewares']) > 0) {
foreach ($configuration['globalMiddlewares'] as $globalMiddleware) {
$this->registerServiceIntoContainer($app, $globalMiddleware);
$this->globalMiddlewares[] = $app->getContainer()->get($globalMiddleware);
}
}
}
}
24 changes: 24 additions & 0 deletions tests/Dummy/AllRouteMiddleware.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace BrandEmbassyTest\Slim\Dummy;

use BrandEmbassy\Slim\Middleware;
use BrandEmbassy\Slim\Request\RequestInterface;
use BrandEmbassy\Slim\Response\ResponseInterface;

class AllRouteMiddleware implements Middleware
{

/**
* @param RequestInterface $request
* @param ResponseInterface $response
* @param callable $next
* @return ResponseInterface
*/
public function __invoke(RequestInterface $request, ResponseInterface $response, callable $next)
{
$response = $response->withAddedHeader('processed-by-all-route-middleware', 'correct');

return $next($request, $response);
}
}
24 changes: 24 additions & 0 deletions tests/Dummy/AppMiddleware.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace BrandEmbassyTest\Slim\Dummy;

use BrandEmbassy\Slim\Middleware;
use BrandEmbassy\Slim\Request\RequestInterface;
use BrandEmbassy\Slim\Response\ResponseInterface;

class AppMiddleware implements Middleware
{

/**
* @param RequestInterface $request
* @param ResponseInterface $response
* @param callable $next
* @return ResponseInterface
*/
public function __invoke(RequestInterface $request, ResponseInterface $response, callable $next)
{
$response = $response->withAddedHeader('processed-by-app-middleware', 'correct');

return $next($request, $response);
}
}
22 changes: 21 additions & 1 deletion tests/SlimApplicationFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
use BrandEmbassy\Slim\SlimApplicationFactory;
use BrandEmbassy\Slim\Request\Request;
use BrandEmbassy\Slim\Response\Response;
use LogicException;
use Nette\DI\Compiler;
use Nette\DI\Container;
use Nette\DI\ContainerLoader;
Expand Down Expand Up @@ -87,6 +86,27 @@ public function testShouldAllowRequestByAccessMiddleware()
$this->assertEquals('{"channelId":"fb_1234"}', $this->getContents($response));
}

public function testShouldHaveHeaderByGlobalMiddleware()
{
$request = $this->createRequest('POST', '/new-api/2.0/channels');

/** @var ResponseInterface $response */
$response = $this->createSlimApp()->process($request, new Response(new \Slim\Http\Response()));

$this->assertEquals(['correct'], $response->getHeader('processed-by-all-route-middleware'));
$this->assertEquals(['correct'], $response->getHeader('processed-by-app-middleware'));
}

public function testShouldProcessedByAppMiddleware()
{
$request = $this->createRequest('POST', '/non-existing/path');

/** @var ResponseInterface $response */
$response = $this->createSlimApp()->process($request, new Response(new \Slim\Http\Response()));

$this->assertEquals(['correct'], $response->getHeader('processed-by-app-middleware'));
}

/**
* @param string $configPath
* @return Container
Expand Down
9 changes: 9 additions & 0 deletions tests/config.neon
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ services:
- BrandEmbassyTest\Slim\Dummy\GoldenKeyAuthMiddleware
- BrandEmbassyTest\Slim\Dummy\CreateChannelAction
- BrandEmbassyTest\Slim\Dummy\ErroringAction
- BrandEmbassyTest\Slim\Dummy\AllRouteMiddleware
- BrandEmbassyTest\Slim\Dummy\AppMiddleware

parameters:
api:
Expand All @@ -30,6 +32,13 @@ parameters:
post:
service: BrandEmbassyTest\Slim\Dummy\ErroringAction

globalMiddlewares:
- BrandEmbassyTest\Slim\Dummy\AllRouteMiddleware

appMiddlewares:
- BrandEmbassyTest\Slim\Dummy\AppMiddleware


slimApi:
slimConfiguration:
settings:
Expand Down

0 comments on commit 24cc28c

Please sign in to comment.