From: Mikael Nordfeldth <mmn@hethane.se> Date: Thu, 29 Aug 2013 21:30:04 +0000 (+0200) Subject: Preparing more object-oriented Action handling X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=b18e24723f3f572b031b142fcbd079b400ad2d67;p=quix0rs-gnu-social.git Preparing more object-oriented Action handling Action classes can now be run by calling the static function 'run'. Eventually actions will be migrated so most functionality gets put into parent classes, and the children don't have to have as much duplicate code as they have now. --- diff --git a/index.php b/index.php index 1566399fa2..dbb7fff6f8 100644 --- a/index.php +++ b/index.php @@ -201,26 +201,6 @@ function setupRW() return; } -function checkMirror($action_obj, $args) -{ - global $config; - - if (common_config('db', 'mirror') && $action_obj->isReadOnly($args)) { - if (is_array(common_config('db', 'mirror'))) { - // "load balancing", ha ha - $arr = common_config('db', 'mirror'); - $k = array_rand($arr); - $mirror = $arr[$k]; - } else { - $mirror = common_config('db', 'mirror'); - } - - // everyone else uses the mirror - - $config['db']['database'] = $mirror; - } -} - function isLoginAction($action) { static $loginActions = array('login', 'recoverpassword', 'api', 'doc', 'register', 'publicxrds', 'otp', 'opensearch', 'rsd', 'hostmeta'); @@ -315,7 +295,7 @@ function main() Event::handle('ArgsInitialize', array(&$args)); - $action = $args['action']; + $action = basename($args['action']); if (!$action || !preg_match('/^[a-zA-Z0-9_-]*$/', $action)) { common_redirect(common_local_url('public')); @@ -356,14 +336,8 @@ function main() $cac = new ClientErrorAction(_('Unknown action'), 404); $cac->showPage(); } else { - $action_obj = new $action_class(); - - checkMirror($action_obj, $args); - try { - if ($action_obj->prepare($args)) { - $action_obj->handle($args); - } + call_user_func("$action_class::run", $args); } catch (ClientException $cex) { $cac = new ClientErrorAction($cex->getMessage(), $cex->getCode()); $cac->showPage(); diff --git a/lib/action.php b/lib/action.php index 8e0f7be94a..3b87b3f5ec 100644 --- a/lib/action.php +++ b/lib/action.php @@ -55,7 +55,20 @@ require_once INSTALLDIR.'/lib/htmloutputter.php'; */ class Action extends HTMLOutputter // lawsuit { - var $args; + // This should be protected/private in the future + public $args = array(); + + // Action properties, set per-class + protected $action = false; + protected $ajax = false; + protected $menus = true; + + // The currently scoped profile + protected $scoped = null; + + // Messages to the front-end user + protected $error = null; + protected $msg = null; /** * Constructor @@ -73,6 +86,44 @@ class Action extends HTMLOutputter // lawsuit parent::__construct($output, $indent); } + function getError() + { + return $this->error; + } + + function getInfo() + { + return $this->msg; + } + + static public function run(array $args=array(), $output='php://output', $indent=null) { + $class = get_called_class(); + $action = new $class($output, $indent); + $action->execute($args); + return $action; + } + + public function execute(array $args=array()) { + // checkMirror stuff + if (common_config('db', 'mirror') && $this->isReadOnly($args)) { + if (is_array(common_config('db', 'mirror'))) { + // "load balancing", ha ha + $arr = common_config('db', 'mirror'); + $k = array_rand($arr); + $mirror = $arr[$k]; + } else { + $mirror = common_config('db', 'mirror'); + } + + // everyone else uses the mirror + common_config_set('db', 'database', $mirror); + } + + if ($this->prepare($args)) { + $this->handle($args); + } + } + /** * For initializing members of the class. * @@ -80,14 +131,19 @@ class Action extends HTMLOutputter // lawsuit * * @return boolean true */ - function prepare($argarray) + function prepare(array $args=array()) { - $this->args =& common_copy_args($argarray); + $this->args = common_copy_args($args); - if ($this->boolean('ajax')) { + $this->action = $this->trimmed('action'); + + if ($this->ajax || $this->boolean('ajax')) { + // check with StatusNet::isAjax() StatusNet::setAjax(true); } + $this->scoped = Profile::current(); + return true; }