diff --git a/application/Espo/Controllers/Layout.php b/application/Espo/Controllers/Layout.php index b0dba5c32a..742dcc7d72 100644 --- a/application/Espo/Controllers/Layout.php +++ b/application/Espo/Controllers/Layout.php @@ -7,7 +7,7 @@ use Espo\Core\Utils as Utils; class Layout extends \Espo\Core\Controllers\Base { - public function read($params, $data) + public function actionRead($params, $data) { $data = $this->getContainer()->get('layout')->get($params['controller'], $params['name']); @@ -15,7 +15,7 @@ class Layout extends \Espo\Core\Controllers\Base } - public function update($params, $data) + public function actionUpdate($params, $data) { $result= $this->getContainer()->get('layout')->set($data, $params['controller'], $params['name']); @@ -29,7 +29,7 @@ class Layout extends \Espo\Core\Controllers\Base } - public function patch($params, $data) + public function actionPatch($params, $data) { $result= $this->getContainer()->get('layout')->merge($data, $params['controller'], $params['name']); @@ -45,4 +45,4 @@ class Layout extends \Espo\Core\Controllers\Base } -?> \ No newline at end of file +?> diff --git a/application/Espo/Controllers/Metadata.php b/application/Espo/Controllers/Metadata.php index 2e6126e3b9..c2490395bf 100644 --- a/application/Espo/Controllers/Metadata.php +++ b/application/Espo/Controllers/Metadata.php @@ -6,15 +6,15 @@ namespace Espo\Controllers; class Metadata extends \Espo\Core\Controllers\Base { - public function read($params, $data) + public function actionRead($params, $data) { - $data= $this->getContainer()->get('metadata')->get(true); + $data = $this->getContainer()->get('metadata')->get(true); return array($data, 'Cannot reach metadata data'); } - public function update($params, $data) + public function actionUpdate($params, $data) { $result = $this->getContainer()->get('metadata')->set($data, $params['type'], $params['scope']); @@ -30,4 +30,4 @@ class Metadata extends \Espo\Core\Controllers\Base } -?> \ No newline at end of file +?> diff --git a/application/Espo/Controllers/Settings.php b/application/Espo/Controllers/Settings.php index ca1591ecc3..ce9eeca1c7 100644 --- a/application/Espo/Controllers/Settings.php +++ b/application/Espo/Controllers/Settings.php @@ -7,7 +7,7 @@ use Espo\Core\Utils as Utils; class Settings extends \Espo\Core\Controllers\Base { - public function read($params, $data) + public function actionRead($params, $data) { $isAdmin = $this->getContainer()->get('user')->isAdmin(); @@ -17,7 +17,7 @@ class Settings extends \Espo\Core\Controllers\Base } - public function patch($params, $data) + public function actionPatch($params, $data) { $isAdmin = $this->getContainer()->get('user')->isAdmin(); @@ -35,4 +35,4 @@ class Settings extends \Espo\Core\Controllers\Base } -?> \ No newline at end of file +?> diff --git a/application/Espo/Core/Application.php b/application/Espo/Core/Application.php index 4c2af5349c..376d6d0453 100644 --- a/application/Espo/Core/Application.php +++ b/application/Espo/Core/Application.php @@ -5,10 +5,6 @@ namespace Espo\Core; class Application { - - protected static $apps = array(); - - private $metadata; private $container; @@ -63,27 +59,9 @@ class Application $this->routeHooks(); $this->routes(); - $this->getSlim()->run(); - - static::$apps[$name] = $this; - - // TODO place routing HERE - // dispatch which controller to use - // $this->controller = new $controllerClassName($this->container, $this->serviceFactory); - // call needed controller method $this->$method($params, $data) - - - // dont't return anything here } - - public static function getInstance($name = 'default') - { - return isset(static::$apps[$name]) ? static::$apps[$name] : null; - } - - protected function routeHooks() { $container = $this->getContainer(); @@ -91,7 +69,7 @@ class Application $serviceFactory = $this->getServiceFactory(); //check user credentials - $this->getSlim()->add(new \Espo\Core\Utils\Api\Auth( $container )); + $this->getSlim()->add(new \Espo\Core\Utils\Api\Auth($container)); //convert all url params to camel case format $this->getSlim()->hook('slim.before.dispatch', function () use ($slim, $container) { @@ -99,68 +77,63 @@ class Application $conditions = $slim->router()->getCurrentRoute()->getConditions(); $upperList = isset($conditions['upper']) ? $conditions['upper'] : array(); - $routeParams= $slim->router()->getCurrentRoute()->getParams(); + $routeParams = $slim->router()->getCurrentRoute()->getParams(); if (!empty($routeParams)) { - foreach($routeParams as $name => &$param) { + foreach ($routeParams as $name => &$param) { $isUpper = in_array($name, $upperList) ? true : false; - $param= \Espo\Core\Utils\Util::toCamelCase($param, $isUpper); + $param = \Espo\Core\Utils\Util::toCamelCase($param, $isUpper); } - $slim->router()->getCurrentRoute()->setParams($routeParams); } }); //END: convert all url params to camel case format - - + $this->getSlim()->hook('slim.before.dispatch', function () use ($slim, $container, $serviceFactory) { - $currentRoute = $slim->router()->getCurrentRoute(); - $conditions = $currentRoute->getConditions(); + $route = $slim->router()->getCurrentRoute(); + $conditions = $route->getConditions(); if (isset($conditions['useController']) && $conditions['useController'] == false) { return; } - $espoController = call_user_func( $slim->router()->getCurrentRoute()->getCallable() ); - $espoKeys = is_array($espoController) ? array_keys($espoController) : array(); + $routeOptions = call_user_func($route->getCallable()); + $routeKeys = is_array($routeOptions) ? array_keys($routeOptions) : array(); - if (!in_array('controller', $espoKeys, true)) { - return $container->get('rest')->render($espoController); + if (!in_array('controller', $routeKeys, true)) { + return $container->get('rest')->render($routeOptions); } + $params = $route->getParams(); + $data = $slim->request()->getBody(); - $params = $currentRoute->getParams(); - $data = $slim->request()->getBody(); - - //prepare controller Params - $controllerParams = array(); - $controllerParams['HttpMethod'] = strtolower($slim->request()->getMethod()); - - foreach($espoController as $key => $val) { - if (strstr($val, ':')) { - $paramName = str_replace(':', '', $val); - $val = $params[$paramName]; + foreach ($routeOptions as $key => $value) { + if (strstr($value, ':')) { + $paramName = str_replace(':', '', $value); + $value = $params[$paramName]; } - $controllerParams[$key] = $val; + $controllerParams[$key] = $value; + } + + $controllerName = $controllerParams['controller']; + + if (!empty($controllerParams['action'])) { + $actionName = $controllerParams['action']; + } else { + $httpMethod = strtolower($slim->request()->getMethod()); + $actionName = $container->get('config')->get('crud')->$httpMethod; } - - $controllerParams['container'] = $container; - $controllerParams['serviceFactory'] = $serviceFactory; - //END: prepare controller Params - - $result = $container->get('controllerManager')->call($controllerParams, $params, $data); + + $controllerManager = new \Espo\Core\ControllerManager($container); + $result = $controllerManager->execute($controllerName, $actionName, $params, $data); return $container->get('rest')->render($result->data, $result->errMessage, $result->errCode); }); - - //return json response $this->getSlim()->hook('slim.after.router', function () use (&$slim) { $slim->contentType('application/json'); - //$routes->contentType('text/javascript'); }); - //END: return json response } @@ -213,7 +186,6 @@ EOT; return array( 'controller' => 'Layout', 'scope' => ':controller', - 'action' => ':name', ); })->conditions( array('upper' => array('controller')) ); @@ -221,7 +193,6 @@ EOT; return array( 'controller' => 'Layout', 'scope' => ':controller', - 'action' => ':name', ); })->conditions( array('upper' => array('controller')) ); @@ -229,7 +200,6 @@ EOT; return array( 'controller' => 'Layout', 'scope' => ':controller', - 'action' => ':name', ); })->via('PATCH')->conditions( array('upper' => array('controller')) ); //END: LAYOUT diff --git a/application/Espo/Core/Container.php b/application/Espo/Core/Container.php index f9b014ea38..380932f43e 100644 --- a/application/Espo/Core/Container.php +++ b/application/Espo/Core/Container.php @@ -19,10 +19,10 @@ class Container public function get($name) { - if (!empty($this->data[$name])) { - return $this->data[$name]; + if (empty($this->data[$name])) { + $this->load($name); } - $this->load($name); + return $this->data[$name]; } @@ -123,14 +123,6 @@ class Container ); } - private function loadControllerManager() - { - $this->data['controllerManager'] = new \Espo\Core\Controllers\Manager( - $this->get('config'), - $this->get('metadata') - ); - } - private function loadDatetime() { $this->data['datetime'] = new \Espo\Core\Utils\Datetime( diff --git a/application/Espo/Core/Controllers/Manager.php b/application/Espo/Core/ControllerManager.php similarity index 70% rename from application/Espo/Core/Controllers/Manager.php rename to application/Espo/Core/ControllerManager.php index 233a853de7..e46a425704 100644 --- a/application/Espo/Core/Controllers/Manager.php +++ b/application/Espo/Core/ControllerManager.php @@ -1,23 +1,26 @@ config = $config; - $this->metadata = $metadata; + public function __construct(\Espo\Core\Container $container) + { + $this->container = $container; + + $this->config = $this->container->get('config'); + $this->metadata = $this->container->get('metadata'); } - protected function getConfig() { return $this->config; @@ -27,7 +30,55 @@ class Manager { return $this->metadata; } + + + public function execute($controllerName, $actionName, $params, $data) + { + $customeClassName = '\\Espo\\Custom\\Controllers\\' . $controllerName; + if (class_exists($customeClassName)) { + $controllerClassName = $customeClassName; + } else { + $moduleName = $this->metadata->getScopeModuleName($controllerName); + if ($moduleName) { + $controllerClassName = '\\Espo\\Modules\\' . $moduleName . '\\Controllers\\' . $controllerName; + } else { + $controllerClassName = '\\Espo\\Controllers\\' . $controllerName; + } + } + + $controller = new $controllerClassName($this->container, $this->serviceFactory); + + $actionNameUcfirst = ucfirst($actionName); + + $beforeMethodName = 'before' . $actionNameUcfirst; + if (method_exists($controller, $beforeMethodName)) { + $controller->$beforeMethodName($params, $data); + } + $actionMethodName = 'action' . $actionNameUcfirst; + + $result = $controller->$actionMethodName($params, $data); + + $afterMethodName = 'after' . $actionNameUcfirst; + if (method_exists($controller, $afterMethodName)) { + $controller->$afterMethodName($params, $data); + } + + if (is_array($result)) { + $returnResult = array_values($result); + if (!empty($returnResult[2])) { + return $this->response($returnResult[0], $returnResult[1], $returnResult[2]); + } + if (!empty($returnResult[1])) { + return $this->response($returnResult[0], $returnResult[1]); + } + if (!empty($returnResult[0])) { + return $this->response($returnResult[0]); + } + return $this->response(false, 'Cannot find requested controller', 404); + } + return $this->response($result); + } /** * Manage of all controllers @@ -38,17 +89,17 @@ class Manager * * @return array */ - public function call($controllerParams, $params, $data = '') + /*public function call($controllerParams, $params, $data = '') { - $config = $this->getConfig(); + + + $espoPath = $this->getConfig()->get('espoPath'); + $controllerPath = Util::concatPath($espoPath, $this->getConfig()->get('controllerPath')); - $espoPath = $config->get('espoPath'); - $controllerPath= Util::concatPath($espoPath, $config->get('controllerPath')); - - $crud = $config->get('crud'); - $baseAction = $crud->$controllerParams['HttpMethod']; + $crud = $this->getConfig()->get('crud'); + $baseAction = $crud->$controllerParams['httpMethod']; if (empty($baseAction)) { - return $this->response(false, 'Cannot find action for HTTP Method ['.$controllerParams['HttpMethod'].']', 404); + return $this->response(false, 'Cannot find action for HTTP Method ['.$controllerParams['httpMethod'].']', 404); } $controller = (object) array( @@ -63,12 +114,11 @@ class Manager return $this->response(false, 'Controller for Scope ['.$controller->scope.'] does not exist.', 404); } - //define default values $classInfo = new \stdClass(); $classInfo->name = $this->getClassName(Util::concatPath($espoPath, 'Core/Base'), 'Controller'); $classInfo->path = $this->getClassPath($classInfo->name); - $classInfo->method = $this->getDefinedMethod($classInfo->name, $controller->baseAction, $controller->action); + $classInfo->method = $this->getDefinedMethod($classInfo->name, $controller->baseAction, $controller->action, 'action'); //Espo\Controlles\Layout and Custom\Espo\Controlles\Layout @@ -79,7 +129,7 @@ class Manager if (!empty($controller->scope)) { //path in Modules dir - $controllerDir = Util::concatPath( $this->getMetadata()->getScopePath($controller->scope), $config->get('controllerPath') ); + $controllerDir = Util::concatPath( $this->getMetadata()->getScopePath($controller->scope), $this->getConfig()->get('controllerPath') ); //ex. Modules\Crm\Controllers\Layout and Cusom\Modules\Crm\Controllers\Layout $controllerClass = $this->getClassName($controllerDir, $controller->name); @@ -105,8 +155,7 @@ class Manager //call class method $className = $classInfo->name; $classMethod = $classInfo->method; - - require_once($classInfo->path); + $class = new $className($controllerParams['container'], $controllerParams['serviceFactory']); //call before method if exists: beforeRead, beforeDetailSmall, beforeReadDetailSmall @@ -145,7 +194,7 @@ class Manager } return $this->response($result); - } + }*/ @@ -156,7 +205,7 @@ class Manager * * @return sting */ - function getDefinedMethod($className, $baseAction, $action, $prefix = '') + /*function getDefinedMethod($className, $baseAction, $action, $prefix = '') { $allActions= get_class_methods($className); $classMethod = ''; @@ -167,7 +216,7 @@ class Manager //method as 'read' $prefixBaseAction = Util::toCamelCase($prefix.$baseAction); - if ( method_exists($className, $prefixBaseAction) ) { + if (method_exists($className, $prefixBaseAction) ) { $classMethod = $prefixBaseAction; } @@ -177,7 +226,7 @@ class Manager //method as 'detailSmall' $prefixAction = Util::toCamelCase($prefix.$action); - if ( method_exists($className, $prefixAction) ) { + if (method_exists($className, $prefixAction) ) { $classMethod = $prefixAction; } @@ -188,7 +237,7 @@ class Manager } return $classMethod; - } + }*/ /** * If method exists, then redefine classInfo @@ -200,10 +249,10 @@ class Manager * * @return object */ - protected function setClassInfo($className, \stdClass $classInfo, \stdClass $controller, $isCustom = true) + /*protected function setClassInfo($className, \stdClass $classInfo, \stdClass $controller, $isCustom = true) { $classPath = $this->getClassPath($className); - $classMethod = $this->getDefinedMethod($className, $controller->baseAction, $controller->action); + $classMethod = $this->getDefinedMethod($className, $controller->baseAction, $controller->action, 'action'); if (file_exists($classPath) && !empty($classMethod) ) { $classInfo->name = $className; @@ -218,7 +267,7 @@ class Manager } return $classInfo; - } + }*/ @@ -230,14 +279,14 @@ class Manager * * @return string */ - protected function getClassName($path, $name = '') + /*protected function getClassName($path, $name = '') { if (!empty($name)) { $path = Util::concatPath($path, Util::toCamelCase($name, true)); } return Util::toFormat($path, '\\'); - } + }*/ /** @@ -248,14 +297,14 @@ class Manager * * @return string */ - protected function getClassPath($path, $name = '') + /*protected function getClassPath($path, $name = '') { if (!empty($name)) { $path = Util::concatPath($path, Util::toCamelCase($name, true)); } return Util::concatPath('application', Util::toFormat($path, '/').'.php'); - } + }*/ /** @@ -277,9 +326,4 @@ class Manager } - - } - - -?> \ No newline at end of file diff --git a/application/Espo/Core/Controllers/Base.php b/application/Espo/Core/Controllers/Base.php index 42c50d2c7a..0836593304 100644 --- a/application/Espo/Core/Controllers/Base.php +++ b/application/Espo/Core/Controllers/Base.php @@ -25,27 +25,27 @@ class Base - public function read($params, $data) + public function actionRead($params, $data) { } - public function update($params, $data) + public function actionUpdate($params, $data) { } - public function patch($params, $data) + public function actionPatch($params, $data) { } - public function create($params, $data) + public function actionCreate($params, $data) { } - public function delete($params, $data) + public function actionDelete($params, $data) { } @@ -54,4 +54,4 @@ class Base } -?> \ No newline at end of file +?>