-
Notifications
You must be signed in to change notification settings - Fork 21
Expand file tree
/
Copy pathWordPressControllersServiceProvider.php
More file actions
107 lines (84 loc) · 3.42 KB
/
WordPressControllersServiceProvider.php
File metadata and controls
107 lines (84 loc) · 3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<?php
namespace Rareloop\Lumberjack\Providers;
use Psr\Http\Message\RequestInterface;
use Rareloop\Router\Invoker;
use Rareloop\Router\ProvidesControllerMiddleware;
use Rareloop\Router\ResponseFactory;
use Stringy\Stringy;
use Tightenco\Collect\Support\Collection;
use Laminas\Diactoros\ServerRequestFactory;
use mindplay\middleman\Dispatcher;
class WordPressControllersServiceProvider extends ServiceProvider
{
public function boot()
{
add_filter('template_include', [$this, 'handleTemplateInclude']);
}
public function handleTemplateInclude($template)
{
include $template;
$controller = $this->getControllerClassFromTemplate($template);
$request = ServerRequestFactory::fromGlobals(
$_SERVER,
$_GET,
$_POST,
$_COOKIE,
$_FILES
);
$response = $this->handleRequest($request, $controller, 'handle');
if ($response) {
$this->app->shutdown($response);
} else {
$this->app->bind('__wp-controller-miss-template', basename($template));
$this->app->bind('__wp-controller-miss-controller', $controller);
}
}
public function getControllerClassFromTemplate($template)
{
$controllerName = Stringy::create(basename($template, '.php'))->upperCamelize().'Controller';
// Classes can't start with a number so we have to special case the behaviour here
if ($controllerName === '404Controller') {
$controllerName = 'Error' . $controllerName;
}
$controllerName = apply_filters('lumberjack_controller_name', $controllerName);
$controllerNamespace = apply_filters('lumberjack_controller_namespace', 'App\\');
return $controllerNamespace.$controllerName;
}
public function handleRequest(RequestInterface $request, $controllerName, $methodName)
{
if (!class_exists($controllerName)) {
if ($this->app->has('logger')) {
$this->app->get('logger')->warning('Controller class `' . $controllerName . '` not found');
}
return false;
}
$this->app->requestHasBeenHandled();
$controller = $this->app->get($controllerName);
$middlewares = [];
if ($controller instanceof ProvidesControllerMiddleware) {
$controllerMiddleware = new Collection($controller->getControllerMiddleware());
$middlewares = $controllerMiddleware->reject(function ($cm) use ($methodName) {
return $cm->excludedForMethod($methodName);
})->map(function ($cm) {
return $cm->middleware();
})->all();
}
$middlewares[] = function ($request) use ($controller, $methodName) {
$invoker = new Invoker($this->app);
$output = $invoker->setRequest($request)->call([$controller, $methodName]);
return ResponseFactory::create($request, $output);
};
$dispatcher = $this->createDispatcher($middlewares);
return $dispatcher->dispatch($request);
}
private function createDispatcher(array $middlewares) : Dispatcher
{
$resolver = null;
if ($this->app->has('middleware-resolver')) {
$resolver = function ($name) {
return $this->app->get('middleware-resolver')->resolve($name);
};
}
return new Dispatcher($middlewares, $resolver);
}
}