diff options
Diffstat (limited to 'public/system/engine/action.php')
-rw-r--r-- | public/system/engine/action.php | 84 |
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 . '!'); + } + } +} |