aboutsummaryrefslogtreecommitdiffstats
path: root/public/system/engine/action.php
diff options
context:
space:
mode:
Diffstat (limited to 'public/system/engine/action.php')
-rw-r--r--public/system/engine/action.php84
1 files changed, 84 insertions, 0 deletions
diff --git a/public/system/engine/action.php b/public/system/engine/action.php
new file mode 100644
index 0000000..bbb51e5
--- /dev/null
+++ b/public/system/engine/action.php
@@ -0,0 +1,84 @@
+<?php
+/**
+ * @package OpenCart
+ * @author Daniel Kerr
+ * @copyright Copyright (c) 2005 - 2017, OpenCart, Ltd. (https://www.opencart.com/)
+ * @license https://opensource.org/licenses/GPL-3.0
+ * @link https://www.opencart.com
+*/
+
+/**
+* Action class
+*/
+class Action {
+ private $id;
+ private $route;
+ private $method = 'index';
+
+ /**
+ * Constructor
+ *
+ * @param string $route
+ */
+ public function __construct($route) {
+ $this->id = $route;
+
+ $parts = explode('/', preg_replace('/[^a-zA-Z0-9_\/]/', '', (string)$route));
+
+ // Break apart the route
+ while ($parts) {
+ $file = DIR_APPLICATION . 'controller/' . implode('/', $parts) . '.php';
+
+ if (is_file($file)) {
+ $this->route = implode('/', $parts);
+
+ break;
+ } else {
+ $this->method = array_pop($parts);
+ }
+ }
+ }
+
+ /**
+ *
+ *
+ * @return string
+ *
+ */
+ public function getId() {
+ return $this->id;
+ }
+
+ /**
+ *
+ *
+ * @param object $registry
+ * @param array $args
+ */
+ public function execute($registry, array $args = array()) {
+ // Stop any magical methods being called
+ if (substr($this->method, 0, 2) == '__') {
+ return new \Exception('Error: Calls to magic methods are not allowed!');
+ }
+
+ $file = DIR_APPLICATION . 'controller/' . $this->route . '.php';
+ $class = 'Controller' . preg_replace('/[^a-zA-Z0-9]/', '', $this->route);
+
+ // Initialize the class
+ if (is_file($file)) {
+ include_once($file);
+
+ $controller = new $class($registry);
+ } else {
+ return new \Exception('Error: Could not call ' . $this->route . '/' . $this->method . '!');
+ }
+
+ $reflection = new ReflectionClass($class);
+
+ if ($reflection->hasMethod($this->method) && $reflection->getMethod($this->method)->getNumberOfRequiredParameters() <= count($args)) {
+ return call_user_func_array(array($controller, $this->method), $args);
+ } else {
+ return new \Exception('Error: Could not call ' . $this->route . '/' . $this->method . '!');
+ }
+ }
+}