Difference between revisions of "6CC001 Workshop - week 04"
From mi-linux
Jump to navigationJump to searchLine 218: | Line 218: | ||
</pre> | </pre> | ||
− | == | + | == Create Command class == |
+ | <pre> | ||
+ | //############################################################################ | ||
+ | // Command class | ||
+ | //############################################################################ | ||
+ | abstract class Command | ||
+ | { | ||
+ | // Make constructor final so sub-classes can't add parameters to it | ||
+ | final function __construct(){} | ||
+ | |||
+ | //############################################################################ | ||
+ | // Execute command | ||
+ | //############################################################################ | ||
+ | function execute(Request $request) | ||
+ | { | ||
+ | // General setup for all commands | ||
+ | // ... | ||
+ | |||
+ | // Then call specific command code | ||
+ | $this->doExecute($request); | ||
+ | } | ||
+ | |||
+ | // Specific command code, to be implemented by each sub-class | ||
+ | abstract function doExecute(Request $request); | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | == Create Command_BlogIndex class == | ||
+ | |||
+ | <pre> | ||
+ | //############################################################################ | ||
+ | // SearchVenueCommand class | ||
+ | //############################################################################ | ||
+ | class Command_BlogIndex extends Command | ||
+ | { | ||
+ | //############################################################################ | ||
+ | // doExecute | ||
+ | //############################################################################ | ||
+ | function doExecute(Request $request) | ||
+ | { | ||
+ | print("Blog Index command"); | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | == Update Controller class == | ||
+ | |||
+ | Add these at the top of the file: | ||
+ | <pre> | ||
+ | require_once("Request.php"); | ||
+ | require_once("CommandResolver.php"); | ||
+ | </pre> | ||
+ | |||
+ | |||
+ | And implement the handleRequest function: | ||
<pre> | <pre> | ||
//############################################################################ | //############################################################################ | ||
Line 235: | Line 289: | ||
$cmd = $cmd_r->getCommand($request); | $cmd = $cmd_r->getCommand($request); | ||
− | + | // Execute command | |
+ | $cmd->execute($request); | ||
} | } | ||
</pre> | </pre> |
Revision as of 15:32, 27 July 2009
Main Page >> Web Application Development >> Workbook >> Week 04
Create and populate database
CREATE TABLE IF NOT EXISTS `messages` ( `id` int(11) NOT NULL auto_increment, `title` varchar(255) NOT NULL, `message` text NOT NULL, `date_added` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=19 ; INSERT INTO `messages` (`id`, `title`, `message`, `date_added`) VALUES (1, 'Test 1', 'Hello world!', '2009-07-27 15:06:29'), (2, 'Test 2', 'Hiya', '2009-07-27 15:06:38');
Create index.php file
// The index simply calls the front controller require("Controller.php"); Controller::run();
Create our Front Controller
require_once("Registry.php"); //############################################################################ // Front Controller class //############################################################################ class Controller { private function __construct(){} //############################################################################ // Main "run" function //############################################################################ static function run() { $instance = new Controller; $instance->init(); $instance->handleRequest(); } //############################################################################ // Init config stuff, e.g. database location, etc. //############################################################################ function init() { Registry::set("database_dsn", "mysql:host=localhost;dbname=YOURDBNAME"); Registry::set("database_login", "YOURUSER"); Registry::set("database_password", "YOURPASSWORD"); } //############################################################################ // Handles request from user //############################################################################ function handleRequest() { print("Hello world!"); } }
Create Registry class
//############################################################################ // Registry class, used to store values to be used across whole application //############################################################################ class Registry { private static $values = array(); //############################################################################ // Store a value //############################################################################ static function set($key, $val) { self::$values[$key] = $val; } //############################################################################ // Get a value //############################################################################ static function get($key) { if(isset(self::$values[$key])) { return self::$values[$key]; } return null; } }
Checkpoint 1
Your page should display "Hello world!"
Create Request class
//############################################################################ // Request class //############################################################################ class Request { private $properties; //############################################################################ // constructor //############################################################################ function __construct() { $this->init(); } //############################################################################ // Gets all parameters from GET, POST etc... //############################################################################ function init() { $this->properties = $_REQUEST; return; } //############################################################################ // Functions to "set" and "get" properties //############################################################################ function getProperty($key) { if(isset($this->properties[$key])) { return $this->properties[$key]; } } function setProperty($key, $val) { $this->properties[$key] = $val; } }
Create CommandResolver class
require_once("Command.php"); require_once("Command_BlogIndex.php"); //############################################################################ // CommandResolver class //############################################################################ class CommandResolver { private static $base_cmd; private static $default_cmd; //############################################################################ // Constructor //############################################################################ function __construct() { if(!self::$base_cmd) { // To check if requested command is a valid command self::$base_cmd = new ReflectionClass("Command"); // Default command to be returned if an error occurs self::$default_cmd = new Command_BlogIndex(); } } //############################################################################ // getCommand creates the appropriate command class, // depending on parameter passed in URL //############################################################################ function getCommand(Request $request) { // Get "cmd" parameter from request $cmd = $request->getProperty('cmd'); // If no command passed in, use default one if(!$cmd) return self::$default_cmd; $filepath = "Command_{$cmd}.php"; $classname = "Command_{$cmd}"; // Check if file containing command class exists if(file_exists($filepath)) { require_once($filepath); // Check if command class exists if(class_exists($classname)) { $cmd_class = new ReflectionClass($classname); // Check of class is a valid command if($cmd_class->isSubClassOf(self::$base_cmd)) { // Return new instance of command return $cmd_class->newInstance(); } } } // Couldn't find command, return default command return clone self::$default_cmd; } }
Create Command class
//############################################################################ // Command class //############################################################################ abstract class Command { // Make constructor final so sub-classes can't add parameters to it final function __construct(){} //############################################################################ // Execute command //############################################################################ function execute(Request $request) { // General setup for all commands // ... // Then call specific command code $this->doExecute($request); } // Specific command code, to be implemented by each sub-class abstract function doExecute(Request $request); }
Create Command_BlogIndex class
//############################################################################ // SearchVenueCommand class //############################################################################ class Command_BlogIndex extends Command { //############################################################################ // doExecute //############################################################################ function doExecute(Request $request) { print("Blog Index command"); } }
Update Controller class
Add these at the top of the file:
require_once("Request.php"); require_once("CommandResolver.php");
And implement the handleRequest function:
//############################################################################ // Handles request from user //############################################################################ function handleRequest() { // Create object that handles request from user $request = new Request(); // Create object that decides which command to create depending on request $cmd_r = new CommandResolver(); // This function return the appropriate command $cmd = $cmd_r->getCommand($request); // Execute command $cmd->execute($request); }
Checkpoint 2
Your website should now display "Command_BlogIndex Object ( )"
If you were to browse to "index.php?cmd=BlogAdd", it should say "Command_BlogAdd Object ( )", indicating that we are creating the right type of command depending on the request.