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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
<?php
/* --------------------------------------------------------------
HttpViewControllerFactory.inc.php 2016-03-24
Gambio GmbH
http://www.gambio.de
Copyright (c) 2016 Gambio GmbH
Released under the GNU General Public License (Version 2)
[http://www.gnu.org/licenses/gpl-2.0.html]
--------------------------------------------------------------
*/
MainFactory::load_class('HttpViewControllerFactoryInterface');
/**
* Class HttpViewControllerFactory
*
* @category System
* @package Http
* @subpackage Factories
* @implements HttpViewControllerFactoryInterface
*/
class HttpViewControllerFactory implements HttpViewControllerFactoryInterface
{
/**
* @var HttpViewControllerRegistryInterface
*/
protected $httpViewControllerRegistry;
/**
* @var HttpContextReaderInterface
*/
protected $httpContextReader;
/**
* @var HttpResponseProcessorInterface
*/
protected $httpResponseProcessor;
/**
* Initialize the http view controller factory.
*
* @param HttpViewControllerRegistryInterface $httpViewControllerRegistry Object which holds the registered
* controller class names.
* @param HttpContextReaderInterface $httpContextReader Object to read the http context.
* @param HttpResponseProcessorInterface $httpResponseProcessor Object to process the http response.
*/
public function __construct(HttpViewControllerRegistryInterface $httpViewControllerRegistry,
HttpContextReaderInterface $httpContextReader,
HttpResponseProcessorInterface $httpResponseProcessor)
{
$this->httpViewControllerRegistry = $httpViewControllerRegistry;
$this->httpContextReader = $httpContextReader;
$this->httpResponseProcessor = $httpResponseProcessor;
}
/**
* Creates a new instance of a http view controller by the given controller name.
*
* @param string $controllerName Expected name of controller (without 'Controller'-Suffix)
*
* @throws LogicException If the controller is not registered in the http view controller registry or the
* controller does not implement the http view controller interface.
*
* @return HttpViewControllerInterface Created controller instance.
*/
public function createController($controllerName)
{
$className = $this->_getControllerClassName($controllerName);
$contentView = $this->_createControllerContentView($controllerName);
$controller = MainFactory::create($className,
$this->httpContextReader,
$this->httpResponseProcessor,
$contentView);
return $controller;
}
/**
* Returns the class name of a http controller by the given controller name.
*
* @param string $controllerName Name of the http controller class.
*
* @throws LogicException When the found controller class does not implement the http view controller interface.
*
* @return string Class name of the http controller.
*/
protected function _getControllerClassName($controllerName)
{
$className = $this->httpViewControllerRegistry->get($controllerName);
if(empty($className))
{
throw new LogicException('No controller class found for [' . htmlentities($controllerName) . ']');
}
if(in_array('HttpViewControllerInterface', class_implements($className)) == false)
{
throw new LogicException('HttpViewControllerInterface not implemented in called controller class ['
. htmlentities($controllerName)
. ']');
}
return $className;
}
/**
* Creates and returns the content view for a http view controller by the controller name.
*
* @param string $controllerName Name of the http controller class.
*
* @throws LogicException When the content view does not implement the content view interface.
*
* @return ContentViewInterface Content view instance for the http view controller.
*/
protected function _createControllerContentView($controllerName)
{
$contentViewClassName = $controllerName . 'ContentView';
if(class_exists($contentViewClassName) == false)
{
$contentView = MainFactory::create('ContentView');
$contentView->set_flat_assigns(true);
return $contentView;
}
if(in_array('ContentViewInterface', class_implements($contentViewClassName)) == false)
{
throw new LogicException('ContentViewInterface not implemented in found ContentView class for called controller ['
. htmlentities($controllerName)
. ']');
}
return MainFactory::create($contentViewClassName);
}
}