namespace demo\command;
class CommandReslover {
private static $baseCmd;
private static $defaultCmd;
public function __construct() {
self::$baseCmd = new \ReflectionClass('\demo\command\Command');
self::$defaultCmd = new DefaultCommand();
}
/**
* 解析请求返回命令
* @param \demo\controller\Request $request
*/
public function getCommand(\demo\controller\Request $request) {
// cmd为url参数名称,如 runner.php?cmd=addUser
$cmd = $request->getProperty('cmd');
$sep = DIRECTORY_SEPARATOR;
// 返回 默认的Command
if (empty($cmd) == true) {
return self::$defaultCmd;
}
//
$cmd = str_replace(array('.', $sep), '', $cmd);
$filePath = "demo{$sep}command{$sep}{$cmd}.php";
$className = '\demo\command\\' . $cmd;
if (file_exists($filePath)) {
@require_once $filePath;
if (class_exists($className)) {
// 判断cmd是否为Command的子类
$cmdClass = new \ReflectionClass($className);
if ($cmdClass->isSubclassOf(self::$baseCmd)) {
return $cmdClass->newInstance();
} else {
$request->addFeedback("Command '{$cmd}' is not a Command!");
}
}
}
$request->addFeedback("Command '{$cmd}' not found!");
return clone self::$defaultCmd;
}
}
Command子类主要封装业务。Command的类图:
Command抽象类代码:
namespace demo\command;
abstract class Command {
// 子类不能够重写
public final function __construct() {
}
public function execute(\demo\controller\Request $request) {
$this->doExecute($request);
}
// 子类实现对应的业务
protected abstract function doExecute(\demo\controller\Request $request);
}
DefaultCommand代码:
namespace demo\command;
class DefaultCommand extends Command {
protected function doExecute(\demo\controller\Request $request) {
$request->addFeedback('Welcome~');
//
include('demo/view/default.php');
echo $request->getFeedbackString();
}
}