Implemented POST requests

This commit is contained in:
Jeroen De Meerleer 2021-04-07 13:31:57 +02:00
parent bfadfbe721
commit 889f6ba8f0
Signed by: JeroenED
GPG Key ID: 28CCCB8F62BFADD6
7 changed files with 91 additions and 30 deletions

View File

@ -6,4 +6,10 @@ default:
login:
path: '/login'
defaults:
_controller: JeroenED\Webcron\Controller\SecurityController::loginAction
_controller: JeroenED\Webcron\Controller\SecurityController::loginAction
login_check:
path: '/login_check'
methods: ['POST']
defaults:
_controller: JeroenED\Webcron\Controller\SecurityController::loginCheckAction

View File

@ -28,6 +28,7 @@ abstract class Controller
{
return $this->kernel->getDbCon();
}
/**
* @return Request
*/
@ -54,4 +55,9 @@ abstract class Controller
$response = new Response($this->twig->render($template, $vars));
return $response;
}
public function generateRoute(string $route): string
{
return $this->kernel->getRouter()->getUrlForRoute($route);
}
}

View File

@ -20,6 +20,7 @@ class Kernel
private string $configDir;
private string $projectDir;
private string $templateDir;
private Router $router;
/**
* @return string
@ -59,7 +60,9 @@ class Kernel
public function getTemplateDir(): string
{
return $this->templateDir;
}/**
}
/**
* @param string $templateDir
*/
public function setTemplateDir(string $templateDir): void
@ -67,12 +70,21 @@ class Kernel
$this->templateDir = $templateDir;
}
/**
* @return Router
*/
public function getRouter(): Router
{
return $this->router;
}
public function handle(): Response
{
$this->parseDotEnv($this->getProjectDir() . '/.env');
$routes = $this->parseRoutes($this->getConfigDir(), 'routes.yaml');
$this->router = new Router();
$this->router->parseRoutes($this->getConfigDir(), 'routes.yaml');
$request = $this->parseRequest();
return $this->createResponse($request, $routes);
return $this->router->route($request, $this);
}
private function parseDotEnv(string $path): void
@ -81,36 +93,14 @@ class Kernel
$dotenv->loadEnv($path);
}
private function parseRoutes(string $dir, string $file): RouteCollection
{
$routeloader = new YamlFileLoader(new FileLocator($dir));
return $routeloader->load($file);
}
private function parseRequest(): Request
{
return Request::createFromGlobals();
$request = Request::createFromGlobals();
return $request;
}
public function getDbCon(): Connection
{
return DriverManager::getConnection(['url' => $_ENV['DATABASE']]);
}
private function createResponse($request, $routes): Response
{
$requestContext = RequestContext::fromUri($request->getUri());
$matcher = new UrlMatcher($routes, $requestContext);
$method = $matcher->match($request->getPathInfo());
$controller = explode('::', $method['_controller']);
$controllerObj = new ('\\' . $controller[0])($request, $this);
$action = $controller[1];
$response = $controllerObj->$action();
if ($response instanceof Response) {
return $response;
} else {
throw new InvalidArgumentException();
}
}
}

51
lib/Framework/Router.php Normal file
View File

@ -0,0 +1,51 @@
<?php
namespace JeroenED\Framework;
use http\Exception\InvalidArgumentException;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGenerator;
use Symfony\Component\Routing\Loader\YamlFileLoader;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\RouteCollection;
class Router
{
private RouteCollection $routes;
private RequestContext $requestContext;
public function route(Request $request, Kernel $kernel): Response
{
$requestContext = new RequestContext();
$this->requestContext = $requestContext->fromRequest($request);
$matcher = new UrlMatcher($this->routes, $this->requestContext);
$method = $matcher->match($request->getPathInfo());
$controller = explode('::', $method['_controller']);
$controllerObj = new ('\\' . $controller[0])($request, $kernel);
$action = $controller[1];
$response = $controllerObj->$action();
if ($response instanceof Response) {
return $response;
} else {
throw new InvalidArgumentException();
}
}
public function parseRoutes(string $dir, string $file): void
{
$routeloader = new YamlFileLoader(new FileLocator($dir));
$this->routes = $routeloader->load($file);
}
public function getUrlForRoute(string $route, array $params = []): string
{
$matcher = new UrlGenerator($this->routes, $this->requestContext);
return $matcher->generate($route, $params, UrlGenerator::ABSOLUTE_URL);
}
}

View File

@ -1,4 +1,6 @@
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
use JeroenED\Framework\Kernel;

View File

@ -16,4 +16,10 @@ class SecurityController extends Controller
}
return $this->render('security/login.html.twig');
}
public function loginCheckAction(): Response
{
$_SESSION['isAuthenticated'] = true;
return new Response('Not yet implemented', 425);
}
}

View File

@ -11,13 +11,13 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
<script src="/public/js/site.js" type="text/javascript"></script>
<script src="/js/site.js" type="text/javascript"></script>
</head>
<body>
<div class="col-md-4 col-md-offset-4 col-xs-12">
<h1>Webcron management</h1>
<form class="form-horizontal" method="post" action="/public/index.php">
<form class="form-horizontal" method="post" action="/login_check">
{% if not error == "" %}
<div class="alert alert-danger fade in">
<a href="#" class="close" data-dismiss="alert">&times;</a>