folder = $projects_folder; } public function getFolder(string $project = ''): string { if (trim($project) == '') { return $this->folder; } return implode(DIRECTORY_SEPARATOR, [ $this->folder, $project ]); } protected $projects; public function list(): array { if ($this->projects === null) { $folders = []; $files = new \DirectoryIterator($this->folder); foreach ($files as $file) { if (!$file->isDir() or $file->isDot()) { continue; } $folders []= (object) [ 'name' => $file->getBasename(), 'folder' => $file->getRealPath() ]; } $this->projects = $folders; } return $this->projects; } public function exists(string $project): bool { $folder = $this->getFolder($project); return file_exists($folder); } public function get(string $project) { $folder = $this->getFolder($project); $factory = new Factory(); return $factory ->find($folder) ->getAll() ->build(); } public function create(string $project) { $this->createFolder($project); } public function createFolder(string $project): bool { if ($this->exists($project)) { return false; } $folder = $this->getFolder($project); $status = mkdir($folder); $status &= file_exists($folder); return $status; } public function createSubfolders(string $project): bool { if (!$this->exists($project)) { return false; } $folders = [ 'cache', 'common', 'common/Controller', 'common/Controller/Web', 'public', 'resources', 'resources/routes', 'resources/routes/web', 'resources/views', 'resources/views/layout', 'setup', 'setup/env', 'setup/common', 'setup/web' ]; $status = false; foreach ($folders as $folder) { $f = implode(DIRECTORY_SEPARATOR, [ $this->folder, $project, $folder ]); if (file_exists($f)) { continue; } $status |= mkdir($f); } return $status; } public function gitInit(string $project): bool { if (!$this->exists($project)) { return false; } $content = [ '# Composer', '/vendor/', 'composer.lock', '', '# Blade', '/cache/', '', '# Env', '/setup/env/' ]; $folder = implode(DIRECTORY_SEPARATOR, [ $this->folder, $project ]); $filename = implode(DIRECTORY_SEPARATOR, [ $folder, '.gitignore' ]); $status = (file_put_contents($filename, implode(PHP_EOL, $content)) !== false); $repo = GitRepository::init($folder); $repo->execute([ 'config', '--global', 'user.name', 'Aldarien' ]); $repo->execute([ 'config', '--global', 'user.email', 'aldarien85@gmail.com' ]); $repo->addFile('.gitignore'); $repo->commit('Inicio de Git'); $repo->createBranch('develop', true); return $status; } public function addComposer(string $project, string $json): bool { if (!$this->exists($project)) { return false; } $folder = $this->getFolder($project); $filename = implode(DIRECTORY_SEPARATOR, [ $folder, 'composer.json' ]); $status = (file_put_contents($filename, $json) !== false); $current = getcwd(); $s = chdir($folder); if ($s) { exec('composer install'); $status &= (file_exists(implode(DIRECTORY_SEPARATOR, [$folder, 'vendor']))); chdir($current); } return $status; } public function addFiles(string $project): bool { if (!$this->exists($project)) { return false; } $folder = $this->getFolder($project); $methods = [ 'SetupApp', 'SetupComposer', 'SetupCommonConfig', 'SetupWebConfig', 'SetupWebSetup', 'PublicIndex', 'PublicHtaccess', 'RoutesRouter', 'RoutesWeb', 'LayoutBase', 'LayoutBody', 'LayoutFooter', 'LayoutHead', 'LayoutHeader', 'LayoutMenu', 'LayoutScripts', 'LayoutStyles' ]; $status = true; foreach ($methods as $method) { $m = 'add' . $method . 'File'; $status &= $this->$m($folder); } return $status; } protected function createFile(string $folder, string $file_name, array $content): bool { $filename = implode(DIRECTORY_SEPARATOR, [ $folder, $file_name ]); $status = (file_put_contents($filename, implode(PHP_EOL, $content)) !== false); $status &= file_exists($filename); return $status; } protected function addSetupAppFile(string $folder): bool { $content = [ "addDefinitions(\$filename);", " }", " }", "}", '', "\$container = \$builder->build();", "\$app = Bridge::create(\$container);", "try {", " \$app->setBasePath(\$container->get('base_url'));", "} catch (Exception \$e) {", "}", '', "foreach (\$folders as \$folder) {", " \$filename = implode(DIRECTORY_SEPARATOR, [", " __DIR__,", " \$folder,", " 'middleware.php'", " ]);", " if (file_exists(\$filename)) {", " include_once \$filename;", " }", "}", '', "\$filename = implode(DIRECTORY_SEPARATOR, [", " \$container->get('folders')->routes,", " 'router.php'", "]);", "if (!file_exists(\$filename)) {", " throw new Exception('Missing router file.');", "}", "include_once \$filename;" ]; $folder = implode(DIRECTORY_SEPARATOR, [ $folder, 'setup' ]); return $this->createFile($folder, 'app.php', $content); } protected function addSetupComposerFile(string $folder): bool { $content = [ 'createFile($folder, 'composer.php', $content); } protected function addSetupCommonConfigFile(string $folder): bool { $project = explode(DIRECTORY_SEPARATOR, $folder); array_pop($project); // common array_pop($project); // setup $project = array_pop($project); $content = [ ' dirname(__DIR__),", " 'urls' => function() {", " \$arr = [];", " \$arr['base'] = '/provm/demos/{$project}';", " return (object) \$arr;", " },", " 'folders' => function() {", " \$arr = [];", " \$arr['base'] = dirname(__DIR__, 2);", " \$arr['resources'] = implode(DIRECTORY_SEPARATOR, [", " \$arr['base'],", " 'resources'", " ]);", " \$arr['routes'] = implode(DIRECTORY_SEPARATOR, [", " \$arr['resources'],", " 'routes'", " ]);", " return (object) \$arr;", " }", '];' ]; $folder = implode(DIRECTORY_SEPARATOR, [ $folder, 'setup', 'common' ]); return $this->createFile($folder, 'config.php', $content); } protected function addSetupWebConfigFile(string $folder): bool { $content = [ " DI\decorate(function(\$prev, Container \$c) {", " \$arr = (array) \$prev;", " \$arr['templates'] = implode(DIRECTORY_SEPARATOR, [", " \$prev->resources,", " 'views'", " ]);", " \$arr['cache'] = implode(DIRECTORY_SEPARATOR, [", " \$prev->base,", " 'cache'", " ]);", " return (object) \$arr;", " }),", " 'assets' => (object) [", " 'styles' => [", " 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.6/semantic.min.css'", " ],", " 'scripts' => [", " 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js',", " 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.6/semantic.min.js'", " ],", " 'fonts' => [", " 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.6/themes/default/assets/fonts/brand-icons.woff',", " 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.6/themes/default/assets/fonts/brand-icons.woff2',", " 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.6/themes/default/assets/fonts/icons.woff',", " 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.6/themes/default/assets/fonts/icons.woff2',", " 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.6/themes/default/assets/fonts/outline-icons.woff',", " 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.6/themes/default/assets/fonts/outline-icons.woff2'", " ]", " ]", "];" ]; $folder = implode(DIRECTORY_SEPARATOR, [ $folder, 'setup', 'web' ]); return $this->createFile($folder, 'config.app', $content); } protected function addSetupWebSetupFile(string $folder): bool { $content = [ " function(Container \$c) {", " return new ProVM\Common\Define\View(", " \$c->get('folders')->templates,", " \$c->get('folders')->cache,", " null,", " [", " 'urls' => \$c->get('urls'),", " 'assets' => \$c->get('assets')", " ]", " );", " }", "];" ]; $folder = implode(DIRECTORY_SEPARATOR, [ $folder, 'setup', 'web' ]); return $this->createFile($folder, 'setup.php', $content); } protected function addPublicIndexFile(string $folder): bool { $content = [ "run();", "" ]; $folder = implode(DIRECTORY_SEPARATOR, [ $folder, 'public' ]); return $this->createFile($folder, 'index.php', $content); } protected function addPublicHtaccessFile(string $folder): bool { $content = [ "RewriteEngine On", "RewriteCond %{REQUEST_FILENAME} !-f", "RewriteCond %{REQUEST_FILENAME} !-d", "RewriteRule ^ index.php [QSA,L]" ]; $folder = implode(DIRECTORY_SEPARATOR, [ $folder, 'public' ]); return $this->createFile($folder, '.htaccess', $content); } protected function addRoutesRouterFile(string $folder): bool { $content = [ "createFile($folder, 'router.php', $content); } protected function addRoutesWebFile(string $folder): bool { $content = [ "isDir()) {", " continue;", " }", " include_once \$file->getRealPath();", " }", "}" ]; $folder = implode(DIRECTORY_SEPARATOR, [ $folder, 'resources', 'routes' ]); return $this->createFile($folder, 'web.php', $content); } protected function addLayoutBaseFile(string $folder): bool { $content = [ "", "", "@include('layout.head')", "@include('layout.body')", "", "" ]; $folder = implode(DIRECTORY_SEPARATOR, [ $folder, 'resources', 'views', 'layout' ]); return $this->createFile($folder, 'base.blade.php', $content); } protected function addLayoutBodyFile(string $folder): bool { $content = [ "
", " @include('layout.header')", "