/
ControllerRouteAction.php
95 lines (79 loc) · 2.76 KB
/
ControllerRouteAction.php
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
<?php
namespace Concrete\Core\Routing;
use Concrete\Core\Support\Facade\Application;
use Concrete\Core\Support\Facade\Facade;
use Symfony\Component\HttpFoundation\Response;
use Concrete\Core\Http\Request;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
use Concrete\Core\Controller\ApplicationAwareControllerResolver;
use Concrete\Core\View\AbstractView;
class ControllerRouteAction implements RouteActionInterface
{
protected $controllerCallback;
/**
* ControllerRouteCallback constructor. $action is something like
* \My\Controller::myAction
* @param string $action
*/
public function __construct($controllerCallback)
{
$this->controllerCallback = $controllerCallback;
}
/**
* @return string
*/
public function getControllerCallback()
{
return $this->controllerCallback;
}
/**
* @param Request $request
* @param Route $route
* @param array $parameters
*
* @return Response
*/
public function execute(Request $request, Route $route, $parameters)
{
$request->attributes->set('_controller', $this->getControllerCallback());
$app = Facade::getFacadeApplication();
$controllerResolver = $app->make(ApplicationAwareControllerResolver::class);
$callback = $controllerResolver->getController($request);
$argumentsResolver = $app->make(ArgumentResolver::class);
$arguments = $argumentsResolver->getArguments($request, $callback);
$controller = $callback[0];
$method = $callback[1];
if (method_exists($controller, 'on_start')) {
$controller->on_start();
}
if (method_exists($controller, 'runAction')) {
$response = $controller->runAction($method, $arguments);
} else {
$response = call_user_func_array([$controller, $method], $arguments);
}
if ($response instanceof Response) {
// note, our RedirectResponse doesn't extend Response, it extends symfony2 response
return $response;
}
if ($response instanceof AbstractView) {
$content = $response->render();
} else if (method_exists($controller, 'getViewObject')) {
$content = null;
$view = $controller->getViewObject();
if (is_object($view)) {
$view->setController($controller);
if (isset($view) && $view instanceof AbstractView) {
$content = $view->render();
}
}
} else {
$content = $response;
}
if (is_object($content)) {
return $content;
}
$response = new Response();
$response->setContent($content);
return $response;
}
}