A mapper isn't a design pattern, but a method to map a request to a controller, such as taken from the Front Controller thread, here is what I have used in the past,
PHP Code:
try {
$fc = new FrontController(
$request_handler = new RequestHandler( new HttpRequest() ), new RequestMapper( array() ) );
$fc -> dispatch();
} catch( ... ) {
}
PHP Code:
interface IController {
public function __construct( IRequestHandler $request_handler, IRequestMapper $request_mapper );
public function attach( IFilter $filter );
}
abstract class BaseFrontController implements IController {
protected $request_handler;
protected $request_mapper;
protected $filters = array();
public function __construct( IRequestHandler $request_handler, IRequestMapper $request_mapper ) {
$this -> request_handler = $request_handler;
$this -> request_mapper = $request_mapper;
}
public function attach( IFilter $filter ) {
$this -> filters[] = $filter;
}
public function dispatch() {
foreach( $this -> filters as $filter ) {
$filter -> preProcess();
}
$this -> process();
foreach( array_reverse( $this -> filters ) as $filter ) {
$filter -> postProcess();
}
}
abstract protected function process();
}
interface IRequestHandler {
public function getLang();
public function getRequestMethod();
public function getRequestParameter( $request_parameter );
public function __construct( HttpRequest $http_request );
}
abstract class BaseRequestHandler implements IRequestHandler {
protected $http_request;
public function __construct( HttpRequest $http_request ) {
$this -> http_request = $http_request;
}
public function getLang() {
if( $lang = $this -> getRequestParameter( 'lang' ) ) {
return $lang;
}
return 'en';
}
public function getRequestMethod() {
return ( strcasecmp( $_SERVER['REQUEST_METHOD'], 'POST' ) == 0 )? 'POST':'GET';
}
public function getRequestParameter( $request_parameter ) {
if( $this -> http_request -> getParameter( $request_parameter ) ) {
return $this -> http_request -> getParameter( $request_parameter );
} else if( $this -> http_request -> getSession( $request_parameter ) ) {
return $this -> http_request -> getSession( $request_parameter );
} else if( $this -> http_request -> getCookie( $request_parameter ) ) {
return $this -> http_request -> getCookie( $request_parameter );
} else {
return false;
}
}
}
class RequestHandler extends BaseRequestHandler {
public function __construct( HttpRequest $http_request ) {
parent::__construct( $http_request );
}
public function getTemplateRoot() {
return $_SERVER['DOCUMENT_ROOT'].'/public_html/admin/workspace/templates/'.$this -> getLang().'/';
}
public function setSession( $parameter, $value ) {
$this -> http_request -> setSession( $parameter, $value );
}
public function getSession( $session_parameter ) {
if( $this -> http_request -> getSession( $session_parameter ) ) {
return $this -> http_request -> getSession( $session_parameter );
}
return false;
}
}
class RequestMapper implements IRequestMapper {
public function __construct( $parameters ) {
if( !is_array( $parameters ) ) {
throw new IllegalParameterException(
'required application parameter(s) are not accessable or parameter(s) type are invalid', E_USER_WARNING
);
}
}
public function mapRequest( IRequestHandler $request_handler ) {
}
}
In the concrete class method process(); you would take the request and pass it to the class method mapRequest(); which belongs to the RequestMapper class. It's that class method - mapRequest(); - that maps the request to a controller, which is then passed back to the Front Controller.
Bookmarks