Skip to content

Commit ca877d2

Browse files
committed
Add Middleware support to WordPress Controllers
1 parent 168f8aa commit ca877d2

File tree

4 files changed

+117
-5
lines changed

4 files changed

+117
-5
lines changed

composer.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"require": {
44
"php": ">=7.1.0",
55
"php-di/php-di": "^6.0.0",
6-
"rareloop/router": "^4.1.0",
6+
"rareloop/router": "^4.2.0",
77
"psr/container": "^1.0",
88
"psr/http-message": "^1.0",
99
"psr/http-server-middleware": "^1.0",
@@ -17,7 +17,8 @@
1717
"zendframework/zend-diactoros": "^1.8",
1818
"rareloop/psr7-server-request-extension": "^2.0.0",
1919
"mmeyer2k/dcrypt": "^8.0.1",
20-
"spatie/macroable": "^1.0"
20+
"spatie/macroable": "^1.0",
21+
"mindplay/middleman": "^3.0.3"
2122
},
2223
"require-dev": {
2324
"phpunit/phpunit": "^6.0",

src/Http/Controller.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace Rareloop\Lumberjack\Http;
4+
5+
use Rareloop\Router\Controller as BaseController;
6+
7+
class Controller extends BaseController
8+
{
9+
10+
}

src/Providers/WordPressControllersServiceProvider.php

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44

55
use Psr\Http\Message\RequestInterface;
66
use Rareloop\Router\Invoker;
7+
use Rareloop\Router\ProvidesControllerMiddleware;
78
use Rareloop\Router\ResponseFactory;
89
use Stringy\Stringy;
10+
use Tightenco\Collect\Support\Collection;
911
use Zend\Diactoros\ServerRequestFactory;
12+
use mindplay\middleman\Dispatcher;
1013

1114
class WordPressControllersServiceProvider extends ServiceProvider
1215
{
@@ -66,8 +69,26 @@ public function handleRequest(RequestInterface $request, $controllerName, $metho
6669

6770
$this->app->requestHasBeenHandled();
6871

69-
$invoker = new Invoker($this->app);
70-
$output = $invoker->setRequest($request)->call([$controllerName, $methodName]);
71-
return ResponseFactory::create($output, $request);
72+
$controller = $this->app->get($controllerName);
73+
$middlewares = [];
74+
75+
if ($controller instanceof ProvidesControllerMiddleware) {
76+
$controllerMiddleware = new Collection($controller->getControllerMiddleware());
77+
78+
$middlewares = $controllerMiddleware->reject(function ($cm) use ($methodName) {
79+
return $cm->excludedForMethod($methodName);
80+
})->map(function ($cm) {
81+
return $cm->middleware();
82+
});
83+
}
84+
85+
$middlewares[] = function ($request) use ($controller, $methodName) {
86+
$invoker = new Invoker($this->app);
87+
$output = $invoker->setRequest($request)->call([$controller, $methodName]);
88+
return ResponseFactory::create($output, $request);
89+
};
90+
91+
$dispatcher = new Dispatcher($middlewares);
92+
return $dispatcher->dispatch($request);
7293
}
7394
}

tests/Unit/Providers/WordPressControllersServiceProviderTest.php

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77
use PHPUnit\Framework\TestCase;
88
use Psr\Http\Message\RequestInterface;
99
use Psr\Http\Message\ResponseInterface;
10+
use Psr\Http\Message\ServerRequestInterface;
11+
use Psr\Http\Server\MiddlewareInterface;
12+
use Psr\Http\Server\RequestHandlerInterface;
1013
use Rareloop\Lumberjack\Application;
14+
use Rareloop\Lumberjack\Http\Controller;
1115
use Rareloop\Lumberjack\Http\Kernal;
1216
use Rareloop\Lumberjack\Providers\WordPressControllersServiceProvider;
1317
use Rareloop\Lumberjack\Test\Unit\BrainMonkeyPHPUnitIntegration;
@@ -223,6 +227,55 @@ public function handle_request_resolves_controller_method_params_from_container(
223227
$this->assertInstanceOf(ResponseInterface::class, $response);
224228
}
225229

230+
/** @test */
231+
public function handle_request_supports_middleware()
232+
{
233+
$app = new Application(__DIR__.'/../');
234+
$controller = new TestControllerWithMiddleware;
235+
$controller->middleware(new AddHeaderMiddleware('X-Header', 'testing123'));
236+
$app->bind(TestControllerWithMiddleware::class, $controller);
237+
238+
$provider = new WordPressControllersServiceProvider($app);
239+
$provider->boot($app);
240+
241+
$response = $provider->handleRequest(new ServerRequest, TestControllerWithMiddleware::class, 'handle');
242+
243+
$this->assertTrue($response->hasHeader('X-Header'));
244+
$this->assertSame('testing123', $response->getHeader('X-Header')[0]);
245+
}
246+
247+
/** @test */
248+
public function handle_request_supports_middleware_applied_to_a_specific_method_using_only()
249+
{
250+
$app = new Application(__DIR__.'/../');
251+
$controller = new TestControllerWithMiddleware;
252+
$controller->middleware(new AddHeaderMiddleware('X-Header', 'testing123'))->only('notHandle');
253+
$app->bind(TestControllerWithMiddleware::class, $controller);
254+
255+
$provider = new WordPressControllersServiceProvider($app);
256+
$provider->boot($app);
257+
258+
$response = $provider->handleRequest(new ServerRequest, TestControllerWithMiddleware::class, 'handle');
259+
260+
$this->assertFalse($response->hasHeader('X-Header'));
261+
}
262+
263+
/** @test */
264+
public function handle_request_supports_middleware_applied_to_a_specific_method_using_except()
265+
{
266+
$app = new Application(__DIR__.'/../');
267+
$controller = new TestControllerWithMiddleware;
268+
$controller->middleware(new AddHeaderMiddleware('X-Header', 'testing123'))->except('handle');
269+
$app->bind(TestControllerWithMiddleware::class, $controller);
270+
271+
$provider = new WordPressControllersServiceProvider($app);
272+
$provider->boot($app);
273+
274+
$response = $provider->handleRequest(new ServerRequest, TestControllerWithMiddleware::class, 'handle');
275+
276+
$this->assertFalse($response->hasHeader('X-Header'));
277+
}
278+
226279
/** @test */
227280
public function handle_template_include_will_call_app_shutdown_when_it_has_handled_a_request()
228281
{
@@ -295,3 +348,30 @@ public function handle()
295348
return new MyResponsable;
296349
}
297350
}
351+
352+
class TestControllerWithMiddleware extends Controller
353+
{
354+
public function handle()
355+
{
356+
357+
}
358+
}
359+
360+
class AddHeaderMiddleware implements MiddlewareInterface
361+
{
362+
private $key;
363+
private $value;
364+
365+
public function __construct($key, $value)
366+
{
367+
$this->key = $key;
368+
$this->value = $value;
369+
}
370+
371+
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface
372+
{
373+
$response = $handler->handle($request);
374+
375+
return $response->withHeader($this->key, $this->value);
376+
}
377+
}

0 commit comments

Comments
 (0)