You've already forked joomla_test
							
							
		
			
	
	
		
			154 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			154 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | /** | ||
|  |  * @package     Joomla.Platform | ||
|  |  * @subpackage  Application | ||
|  |  * | ||
|  |  * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved. | ||
|  |  * @license     GNU General Public License version 2 or later; see LICENSE | ||
|  |  */ | ||
|  | 
 | ||
|  | defined('JPATH_PLATFORM') or die; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Class to define an abstract Web application router. | ||
|  |  * | ||
|  |  * @package     Joomla.Platform | ||
|  |  * @subpackage  Application | ||
|  |  * @since       12.2 | ||
|  |  */ | ||
|  | abstract class JApplicationWebRouter | ||
|  | { | ||
|  | 	/** | ||
|  | 	 * @var    JApplicationWeb  The web application on whose behalf we are routing the request. | ||
|  | 	 * @since  12.2 | ||
|  | 	 */ | ||
|  | 	protected $app; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * @var    string  The default page controller name for an empty route. | ||
|  | 	 * @since  12.2 | ||
|  | 	 */ | ||
|  | 	protected $default; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * @var    string  Controller class name prefix for creating controller objects by name. | ||
|  | 	 * @since  12.2 | ||
|  | 	 */ | ||
|  | 	protected $controllerPrefix; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * @var    JInput  An input object from which to derive the route. | ||
|  | 	 * @since  12.2 | ||
|  | 	 */ | ||
|  | 	protected $input; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Constructor. | ||
|  | 	 * | ||
|  | 	 * @param   JApplicationWeb  $app    The web application on whose behalf we are routing the request. | ||
|  | 	 * @param   JInput           $input  An optional input object from which to derive the route.  If none | ||
|  | 	 *                                   is given than the input from the application object will be used. | ||
|  | 	 * | ||
|  | 	 * @since   12.2 | ||
|  | 	 */ | ||
|  | 	public function __construct(JApplicationWeb $app, JInput $input = null) | ||
|  | 	{ | ||
|  | 		$this->app   = $app; | ||
|  | 		$this->input = ($input === null) ? $this->app->input : $input; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Find and execute the appropriate controller based on a given route. | ||
|  | 	 * | ||
|  | 	 * @param   string  $route  The route string for which to find and execute a controller. | ||
|  | 	 * | ||
|  | 	 * @return  mixed   The return value of the controller executed | ||
|  | 	 * | ||
|  | 	 * @since   12.2 | ||
|  | 	 * @throws  InvalidArgumentException | ||
|  | 	 * @throws  RuntimeException | ||
|  | 	 */ | ||
|  | 	public function execute($route) | ||
|  | 	{ | ||
|  | 		// Get the controller name based on the route patterns and requested route.
 | ||
|  | 		$name = $this->parseRoute($route); | ||
|  | 
 | ||
|  | 		// Get the controller object by name.
 | ||
|  | 		$controller = $this->fetchController($name); | ||
|  | 
 | ||
|  | 		// Execute the controller.
 | ||
|  | 		return $controller->execute(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Set the controller name prefix. | ||
|  | 	 * | ||
|  | 	 * @param   string  $prefix  Controller class name prefix for creating controller objects by name. | ||
|  | 	 * | ||
|  | 	 * @return  JApplicationWebRouter  This object for method chaining. | ||
|  | 	 * | ||
|  | 	 * @since   12.2 | ||
|  | 	 */ | ||
|  | 	public function setControllerPrefix($prefix) | ||
|  | 	{ | ||
|  | 		$this->controllerPrefix	= (string) $prefix; | ||
|  | 
 | ||
|  | 		return $this; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Set the default controller name. | ||
|  | 	 * | ||
|  | 	 * @param   string  $name  The default page controller name for an empty route. | ||
|  | 	 * | ||
|  | 	 * @return  JApplicationWebRouter  This object for method chaining. | ||
|  | 	 * | ||
|  | 	 * @since   12.2 | ||
|  | 	 */ | ||
|  | 	public function setDefaultController($name) | ||
|  | 	{ | ||
|  | 		$this->default = (string) $name; | ||
|  | 
 | ||
|  | 		return $this; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Parse the given route and return the name of a controller mapped to the given route. | ||
|  | 	 * | ||
|  | 	 * @param   string  $route  The route string for which to find and execute a controller. | ||
|  | 	 * | ||
|  | 	 * @return  string  The controller name for the given route excluding prefix. | ||
|  | 	 * | ||
|  | 	 * @since   12.2 | ||
|  | 	 * @throws  InvalidArgumentException | ||
|  | 	 */ | ||
|  | 	abstract protected function parseRoute($route); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Get a JController object for a given name. | ||
|  | 	 * | ||
|  | 	 * @param   string  $name  The controller name (excluding prefix) for which to fetch and instance. | ||
|  | 	 * | ||
|  | 	 * @return  JController | ||
|  | 	 * | ||
|  | 	 * @since   12.2 | ||
|  | 	 * @throws  RuntimeException | ||
|  | 	 */ | ||
|  | 	protected function fetchController($name) | ||
|  | 	{ | ||
|  | 		// Derive the controller class name.
 | ||
|  | 		$class = $this->controllerPrefix . ucfirst($name); | ||
|  | 
 | ||
|  | 		// If the controller class does not exist panic.
 | ||
|  | 		if (!class_exists($class) || !is_subclass_of($class, 'JController')) | ||
|  | 		{ | ||
|  | 			throw new RuntimeException(sprintf('Unable to locate controller `%s`.', $class), 404); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// Instantiate the controller.
 | ||
|  | 		$controller = new $class($this->input, $this->app); | ||
|  | 
 | ||
|  | 		return $controller; | ||
|  | 	} | ||
|  | } |