Pop\Project\Install\Controllers::createControllers PHP Метод

createControllers() публичный статический Метод

Create the controller class files
public static createControllers ( array $controllers, array $base = null, string $depth = null, Generator $controllerCls = null ) : void
$controllers array
$base array
$depth string
$controllerCls Pop\Code\Generator
Результат void
    public static function createControllers($controllers, $base = null, $depth = null, $controllerCls = null)
    {
        foreach ($controllers as $key => $value) {
            $level = strpos($key, '/') !== false ? $depth . $key : null;
            if (null !== $level) {
                if ($level != '/') {
                    $l = substr($level, 1);
                    if (strpos($l, '/') !== false) {
                        $l = substr($l, 0, strpos($l, '/'));
                    }
                    $ns = '\\' . ucfirst($l);
                    $l = '/' . ucfirst($l);
                    $lView = $level;
                } else {
                    $ns = null;
                    $l = null;
                    $lView = null;
                }
                // Check to make sure an 'index' method is defined for the top-level controller
                if (substr_count($level, '/') == 1 && !array_key_exists('index', $value)) {
                    echo "The 'index' method of the top level controller '{$key}' is not defined." . PHP_EOL;
                    exit(0);
                }
                $viewPath = $base['view'] . ($level != '/' ? $level : null);
                $relativeViewPath = strpos($base['src'] . $l, 'Controller/') !== false ? '/../../../../view' . $lView : '/../../../view' . $lView;
                $srcPath = $base['src'] . $l;
                $namespace = $base['namespace'] . $ns;
                if (array_key_exists('index', $value) && (null === $l || strtolower($key) == strtolower($l))) {
                    $ctrlFile = $base['src'] . $l . '/IndexController.php';
                    $parent = 'C';
                } else {
                    if (array_key_exists('index', $value) && strtolower($key) != strtolower($l)) {
                        $ctrlFile = $base['src'] . $l . '/' . ucfirst(substr($key, 1)) . 'Controller.php';
                        $parent = 'C';
                    } else {
                        $ctrlFile = $base['src'] . $l . '/' . ucfirst(substr($key, 1)) . 'Controller.php';
                        $parent = 'IndexController';
                    }
                }
                if (!file_exists($viewPath)) {
                    mkdir($viewPath);
                }
                if (!file_exists($srcPath)) {
                    mkdir($srcPath);
                }
                if (null === $controllerCls || $controllerCls->getFullpath() != $ctrlFile) {
                    $controllerCls = new Generator($ctrlFile, Generator::CREATE_CLASS);
                    // Set namespace
                    $ns = new NamespaceGenerator($namespace);
                    $ns->setUses(array('Pop\\Http\\Response', 'Pop\\Http\\Request', array('Pop\\Mvc\\Controller', 'C'), 'Pop\\Mvc\\View', 'Pop\\Project\\Project'));
                    // Create the constructor
                    $construct = new MethodGenerator('__construct');
                    $construct->setDesc('Constructor method to instantiate the controller object');
                    $construct->addArguments(array(array('name' => 'request', 'value' => 'null', 'type' => 'Request'), array('name' => 'response', 'value' => 'null', 'type' => 'Response'), array('name' => 'project', 'value' => 'null', 'type' => 'Project'), array('name' => 'viewPath', 'value' => 'null', 'type' => 'string')));
                    if ($parent == 'C') {
                        $construct->appendToBody("if (null === \$viewPath) {")->appendToBody("    \$viewPath = __DIR__ . '{$relativeViewPath}';")->appendToBody("}" . PHP_EOL);
                    }
                    if ($level != '/') {
                        $construct->appendToBody("if (null === \$request) {")->appendToBody("    \$request = new Request(null, '{$level}');")->appendToBody("}" . PHP_EOL);
                    }
                    $construct->appendToBody("parent::__construct(\$request, \$response, \$project, \$viewPath);", false);
                    $construct->getDocblock()->setReturn('self');
                    $controllerCls->setNamespace($ns);
                    $controllerCls->code()->setParent($parent)->addMethod($construct);
                }
            }
            if (is_array($value)) {
                self::createControllers($value, $base, $level, $controllerCls);
            } else {
                // Copy view files over
                $viewPath = $base['view'] . ($depth != '/' ? $depth : null);
                if (!file_exists($viewPath)) {
                    mkdir($viewPath);
                }
                $viewFile = $base['installDir'] . '/view' . ($depth != '/' ? $depth : null) . '/' . $value;
                $viewFileCopy = $base['view'] . ($depth != '/' ? $depth : null) . '/' . $value;
                if (file_exists($viewFile)) {
                    copy($viewFile, $viewFileCopy);
                }
                // Create action methods
                $method = new MethodGenerator($key);
                $method->setDesc('The \'' . $key . '()\' method.');
                $code = $key == 'error' ? '404' : null;
                if ($controllerCls->code()->getParent() != 'C') {
                    $vp = substr($depth, strrpos($depth, '/') + 1) . '/' . $value;
                } else {
                    $vp = $value;
                }
                $method->appendToBody("\$this->view = View::factory(\$this->viewPath . '/{$vp}');");
                $method->appendToBody("\$this->send(" . $code . ");", false);
                $method->getDocblock()->setReturn('void');
                $controllerCls->code()->addMethod($method);
            }
        }
        $controllerCls->save();
    }