Last active
August 29, 2015 13:57
-
-
Save chukShirley/9921166 to your computer and use it in GitHub Desktop.
Simple Front Controller with Namespaces
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Sabel\Scrap\Loader; | |
class Autoloader | |
{ | |
private $_fileExtension = '.php'; | |
private $_namespace; | |
private $_includePath; | |
private $_namespaceSeparator = '\\'; | |
/** | |
* Creates a new <tt>SplClassLoader</tt> that loads classes of the | |
* specified namespace. | |
* | |
* @param string $ns The namespace to use. | |
*/ | |
public function __construct($ns = null, $includePath = null) | |
{ | |
$this->_namespace = $ns; | |
$this->_includePath = $includePath; | |
} | |
/** | |
* Sets the namespace separator used by classes in the namespace of this class loader. | |
* | |
* @param string $sep The separator to use. | |
*/ | |
public function setNamespaceSeparator($sep) | |
{ | |
$this->_namespaceSeparator = $sep; | |
} | |
/** | |
* Gets the namespace seperator used by classes in the namespace of this class loader. | |
* | |
* @return void | |
*/ | |
public function getNamespaceSeparator() | |
{ | |
return $this->_namespaceSeparator; | |
} | |
/** | |
* Sets the base include path for all class files in the namespace of this class loader. | |
* | |
* @param string $includePath | |
*/ | |
public function setIncludePath($includePath) | |
{ | |
$this->_includePath = $includePath; | |
} | |
/** | |
* Gets the base include path for all class files in the namespace of this class loader. | |
* | |
* @return string $includePath | |
*/ | |
public function getIncludePath() | |
{ | |
return $this->_includePath; | |
} | |
/** | |
* Sets the file extension of class files in the namespace of this class loader. | |
* | |
* @param string $fileExtension | |
*/ | |
public function setFileExtension($fileExtension) | |
{ | |
$this->_fileExtension = $fileExtension; | |
} | |
/** | |
* Gets the file extension of class files in the namespace of this class loader. | |
* | |
* @return string $fileExtension | |
*/ | |
public function getFileExtension() | |
{ | |
return $this->_fileExtension; | |
} | |
/** | |
* Installs this class loader on the SPL autoload stack. | |
*/ | |
public function register() | |
{ | |
spl_autoload_register(array($this, 'loadClass')); | |
} | |
/** | |
* Uninstalls this class loader from the SPL autoloader stack. | |
*/ | |
public function unregister() | |
{ | |
spl_autoload_unregister(array($this, 'loadClass')); | |
} | |
/** | |
* Loads the given class or interface. | |
* | |
* @param string $className The name of the class to load. | |
* @return void | |
*/ | |
public function loadClass($className) | |
{ | |
if (null === $this->_namespace || $this->_namespace.$this->_namespaceSeparator === substr($className, 0, strlen($this->_namespace.$this->_namespaceSeparator))) { | |
$fileName = ''; | |
$namespace = ''; | |
if (false !== ($lastNsPos = strripos($className, $this->_namespaceSeparator))) { | |
$namespace = substr($className, 0, $lastNsPos); | |
$className = substr($className, $lastNsPos + 1); | |
$fileName = str_replace($this->_namespaceSeparator, DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; | |
} | |
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . $this->_fileExtension; | |
require ($this->_includePath !== null ? $this->_includePath . DIRECTORY_SEPARATOR : '') . $fileName; | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Sabel\Scrap\Controller; | |
use Sabel\Scrap\Controller\FrontControllerInterface; | |
use Sabel\Scrap\Model\Db; | |
class FrontController implements FrontControllerInterface | |
{ | |
const DEFAULT_CONTROLLER = "IndexController"; | |
const DEFAULT_ACTION = "index"; | |
protected $controller = self::DEFAULT_CONTROLLER; | |
protected $action = self::DEFAULT_ACTION; | |
protected $params = array(); | |
protected $basePath = "mybasepath/"; | |
public function __construct(array $options = array()) { | |
if (empty($options)) { | |
$this->parseUri(); | |
} | |
else { | |
if (isset($options["controller"])) { | |
$this->setController($options["controller"]); | |
} | |
if (isset($options["action"])) { | |
$this->setAction($options["action"]); | |
} | |
if (isset($options["params"])) { | |
$this->setParams($options["params"]); | |
} | |
} | |
} | |
protected function parseUri() { | |
$path = trim(parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH), "/"); | |
//$path = preg_replace('/[^a-zA-Z0-9]//', "", $path); | |
if (strpos($path, $this->basePath) === 0) { | |
$path = substr($path, strlen($this->basePath)); | |
} | |
@list($controller, $action, $params) = explode("/", $path, 3); | |
if (isset($controller)) { | |
$this->setController($controller); | |
} | |
if (isset($action)) { | |
$this->setAction($action); | |
} | |
if (isset($params)) { | |
$this->setParams(explode("/", $params)); | |
} | |
} | |
public function setController($controller) { | |
$controller = ucfirst(strtolower($controller)) . "Controller"; | |
if (!class_exists(__NAMESPACE__.'\\'.$controller)) { | |
throw new \InvalidArgumentException( | |
"The action controller '$controller' has not been defined."); | |
} | |
$this->controller = $controller; | |
return $this; | |
} | |
public function setAction($action) { | |
$action .= "Action"; | |
$reflector = new \ReflectionClass(__NAMESPACE__.'\\'.$this->controller); | |
if (!$reflector->hasMethod($action)) { | |
throw new \InvalidArgumentException( | |
"The controller action '$action' has been not defined."); | |
} | |
$this->action = $action; | |
return $this; | |
} | |
public function setParams(array $params) { | |
$this->params = $params; | |
return $this; | |
} | |
public function run() { | |
// require_once '../../../../PHP/checkCredentials.php'; | |
require_once 'ToolkitService.php'; | |
// require_once '/../Model/Db.php'; | |
// Connect to database | |
$db = new Db('*LOCAL', 'AS400', 'AS400'); | |
try | |
{ | |
$db->connect(); | |
} | |
catch (\Exception $e) | |
{ | |
error_log("Couldn't connect to db"); | |
} | |
// Create toolkit object | |
try | |
{ | |
$toolkitObj = \ToolkitService::getInstance($db->getHandler(), 'DB2_I5_NAMING_ON'); | |
$toolkitObj->setOptions(array('stateless'=>true)); | |
} | |
catch (\Exception $e) | |
{ | |
echo $e->getMessage(), "\n"; | |
exit(); | |
} | |
$this->controller = __NAMESPACE__."\\".$this->controller; | |
call_user_func_array(array(new $this->controller($db,$toolkitObj), $this->action), $this->params); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
use Sabel\Scrap\Loader\Autoloader; | |
use Sabel\Scrap\Controller\FrontController; | |
ini_set("error_log","/usr/local/zendsvr6/var/log/chuk-debug.log"); | |
require_once __DIR__ . "/../Loader/Autoloader.php"; | |
$autoloader = new Autoloader('Sabel\Scrap',__DIR__.'/../lib'); | |
$autoloader->register(); | |
$frontController = new FrontController(); | |
$frontController->run(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment