]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Preparing more object-oriented Action handling
authorMikael Nordfeldth <mmn@hethane.se>
Thu, 29 Aug 2013 21:30:04 +0000 (23:30 +0200)
committerMikael Nordfeldth <mmn@hethane.se>
Thu, 29 Aug 2013 21:33:05 +0000 (23:33 +0200)
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.

index.php
lib/action.php

index 1566399fa2f351e8381796397d0f697b5b4e617f..dbb7fff6f835e51435a12b6b782511b106870ced 100644 (file)
--- 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();
index 8e0f7be94a68bd28f51ab2e02b66d36c4d395754..3b87b3f5ec88a066bc5df5fa14a3e14a8b11bc0f 100644 (file)
@@ -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;
     }