Sistema web para crear proyecto web nuevo

This commit is contained in:
2020-07-03 17:21:55 -04:00
parent af3507bda5
commit ad3952501f
53 changed files with 2437 additions and 0 deletions

View File

@ -0,0 +1,181 @@
<?php
namespace ProVM\Projects\Common\Controller\Web;
use Psr\Container\ContainerInterface as Container;
use Psr\Http\Message\RequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use ProVM\Common\Alias\View;
use ProVM\Common\Define\Controller\Redirect;
use ProVM\Projects\Common\Service\Projects;
use ProVM\Projects\Common\Factory\Project as Factory;
class Project {
use Redirect;
public function __invoke(Request $request, Response $response, Projects $service, View $view, $project): Response {
$p = $service->get($project);
$p->config = $this->reduceFiles($p->config, '/setup', '', '/');
$p->controllers = $this->reduceFiles($p->controllers, ['/common', 'ProVM/' . ucwords($project) . '/Common'], '.php', '/');
foreach ($p->routes as $space => $routes) {
$p->routes->$space = $this->reduceFiles($routes, '/resources/routes', '', '/');
}
$p->views = $this->reduceFiles($p->views, '/resources/views/', '.blade.php', '.');
return $view->render($response, 'projects.show', ['project' => $p]);
}
protected function reduceFiles($array, $prefix, $suffix, $glue) {
if (!is_array($prefix)) {
$prefix = [$prefix];
}
if (!is_array($suffix)) {
$suffix = [$suffix];
}
$arr = [];
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($array), \RecursiveIteratorIterator::SELF_FIRST);
$pk = '';
foreach ($it as $k => $v) {
if (is_array($v)) {
$pk = str_replace($prefix[0], $prefix[1] ?? '', $k);
continue;
}
$arr []= str_replace($suffix[0], $suffix[1] ?? '', implode($glue, [$pk, $v]));
}
return $arr;
}
public function addView(Request $request, Response $response, Projects $service, View $view, $project): Response {
$folder = implode(DIRECTORY_SEPARATOR, [
$service->getFolder($project),
'resources',
'views'
]);
$files = new \DirectoryIterator($folder);
$subfolders = [];
foreach ($files as $file) {
if (!$file->isDir() or $file->isDot()) {
continue;
}
$subfolders []= $file->getBasename();
}
$factory = new Factory();
$p = $factory->find($service->getFolder($project))->getViews()->build();
$views = [];
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($p->views), \RecursiveIteratorIterator::SELF_FIRST);
$pk = '';
foreach ($it as $k => $v) {
if (is_array($v)) {
$pk = str_replace('/resources/views/', '', $k);
continue;
}
$views []= str_replace('.blade.php', '', implode('.', [$pk, $v]));
}
$project = $p;
return $view->render($response, 'projects.views.add', compact('project', 'subfolders', 'views'));
}
public function doAddView(Request $request, Response $response, Container $container, Projects $service, $project): Response {
$post = $request->getParsedBody();
$options = [];
if (trim($post['extends']) != '') {
$options['extends'] = $post['extends'];
}
if (trim($post['seccion']) != '') {
$options['section'] = $post['seccion'];
}
$location = $post['location'];
$status = $service->addView($project, $post['name'], $location, $options);
return $this->withRedirect($response, implode('/', [
$container->get('urls')->base,
'project',
$project
]));
}
public function addController(Request $request, Response $response, Projects $service, View $view, $project): Response {
$folder = implode(DIRECTORY_SEPARATOR, [
$service->getFolder($project),
'common',
'Controller'
]);
$files = new \DirectoryIterator($folder);
$subfolders = [];
foreach ($files as $file) {
if (!$file->isDir() or $file->isDot()) {
continue;
}
$subfolders []= $file->getBasename();
}
$factory = new Factory();
$p = $factory->find($service->getFolder($project))->getViews()->build();
$views = [];
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($p->views), \RecursiveIteratorIterator::SELF_FIRST);
$pk = '';
foreach ($it as $k => $v) {
if (is_array($v)) {
$pk = str_replace('/resources/views/', '', $k);
continue;
}
$views []= str_replace('.blade.php', '', implode('.', [$pk, $v]));
}
$project = $p;
return $view->render($response, 'projects.controllers.add', compact('project', 'subfolders', 'views'));
}
public function doAddController(Request $request, Response $response, Container $container, Projects $service, $project): Response {
$post = $request->getParsedBody();
$name = str_replace(' ', '', ucwords($post['name']));
$status = $service->addController($project, $post['space'], $name, $post['template']);
return $this->withRedirect($response, implode('/', [
$container->get('urls')->base,
'project',
$project
]));
}
public function addRoute(Request $request, Response $response, Projects $service, View $view, $project): Response {
$folder = implode(DIRECTORY_SEPARATOR, [
$service->getFolder($project),
'resources',
'routes'
]);
$files = new \DirectoryIterator($folder);
$subfolders = [];
foreach ($files as $file) {
if (!$file->isDir() or $file->isDot()) {
continue;
}
$subfolders []= $file->getBasename();
}
$factory = new Factory();
$p = $factory->find($service->getFolder($project))->getViews()->getControllers()->build();
$views = [];
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($p->views), \RecursiveIteratorIterator::SELF_FIRST);
$pk = '';
foreach ($it as $k => $v) {
if (is_array($v)) {
$pk = str_replace('/resources/views/', '', $k);
continue;
}
$views []= str_replace('.blade.php', '', implode('.', [$pk, $v]));
}
$controllers = [];
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($p->controllers), \RecursiveIteratorIterator::SELF_FIRST);
$pk = '';
foreach ($it as $k => $v) {
if (is_array($v)) {
$pk = str_replace('/common', 'ProVM/Projects/Common', $k);
continue;
}
$controllers []= str_replace(['/', '.php'], ["\\", ''], implode('/', [$pk, $v]));
}
$project = $p;
return $view->render($response, 'projects.routes.add', compact('project', 'subfolders', 'views', 'controllers'));
}
public function doAddRoute(Request $request, Response $response, Container $container, Projects $service, $project): Response {
$post = $request->getParsedBody();
$space = $post['space'];
$name = $post['group'];
$route = $post['name'];
$callback = $post['controller'] . '::class';
$service->addRoute($project, $space, $name, $route, $callback);
return $this->withRedirect($response, implode('/', [
$container->get('urls')->base,
'project',
$project
]));
}
}