1<?php
2/**
3 * Copyright 2008-2017 Horde LLC (http://www.horde.org/)
4 *
5 * See the enclosed file LICENSE for license information (BSD). If you
6 * did not receive this file, see http://www.horde.org/licenses/bsd.
7 *
8 * @author   James Pepin <james@bluestatedigital.com>
9 * @category Horde
10 * @license  http://www.horde.org/licenses/bsd BSD
11 * @package  Controller
12 */
13
14/**
15 * Class to execute the controller request
16 *
17 * @author    James Pepin <james@bluestatedigital.com>
18 * @category  Horde
19 * @copyright 2008-2017 Horde LLC
20 * @license   http://www.horde.org/licenses/bsd BSD
21 * @package   Controller
22 */
23class Horde_Controller_Runner
24{
25    protected $_logger;
26
27    public function __construct(Horde_Log_Logger $logger)
28    {
29        $this->_logger = $logger;
30    }
31
32    public function execute(Horde_Injector $injector,
33                            Horde_Controller_Request $request,
34                            Horde_Controller_RequestConfiguration $config)
35    {
36        $this->_logger->debug('RequestConfiguration in Horde_Controller_Runner: ' . print_r($config, true));
37
38        $exporter = $injector->getInstance($config->getSettingsExporterName());
39        $exporter->exportBindings($injector);
40
41        $controller = $config->getControllerName();
42        if (!$controller) {
43            throw new Horde_Controller_Exception('No controller defined');
44        }
45
46        $implementationBinder = new Horde_Injector_Binder_Implementation($controller);
47        $injector->addBinder('Horde_Controller', new Horde_Injector_Binder_AnnotatedSetters($implementationBinder));
48
49        $filterRunner = $injector->createInstance('Horde_Controller_FilterRunner');
50        $exporter->exportFilters($filterRunner, $injector);
51
52        $response = $filterRunner->processRequest($request, $injector->createInstance('Horde_Controller_Response'));
53        if ($response->internalRedirect()) {
54            $this->_logger->debug('Internal redirect');
55            return $this->execute($injector->createChildInjector(), $request, $response->getRedirectConfiguration());
56        }
57
58        $this->_logger->debug('Returning Horde_Controller_Response');
59        return $response;
60    }
61}
62