Skip to content

Commit

Permalink
configura SelectController
Browse files Browse the repository at this point in the history
- corrige não passar os dados corretamente
- adiciona método 405 para quando o método não é encontrado
  • Loading branch information
tadeubdev committed Aug 9, 2020
1 parent fe569ee commit b0aca4f
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 23 deletions.
2 changes: 1 addition & 1 deletion App/Views/Layouts/405.php
Expand Up @@ -49,7 +49,7 @@
<main role="main" id="main">
<div>
<h1 id="main-title">405</h1>
<h3 id="main-subtitle">Poxa! Esse método não existe para esse método!</h3>
<h3 id="main-subtitle">Poxa! Este método não existe para esta classe!</h3>
<i style="opacity:0.80;color:#cc0033">
<?php echo "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; ?>
</i>
Expand Down
65 changes: 43 additions & 22 deletions System/Route/SelectController.php
Expand Up @@ -11,6 +11,8 @@
*/

use System\Request\Request;
use System\Controller\Controller;


class SelectController
{
Expand Down Expand Up @@ -43,6 +45,23 @@ public function __construct(GetRoute $getRoute)
}
}

public function run()
{
$similarRoutes = $this->takesSimilarRoutes();
$similarRoutes = $this->takesRegexRoutes($similarRoutes);
$similarRoutes = $this->takesActualRouteByRegex($similarRoutes);
$similarRoutes = $this->takesRouteData($similarRoutes);
$similarRoutes = $this->takesRoutesSimilarToMethod($similarRoutes);

// pega a primeira rota
$actualRoute = current($similarRoutes);
$controller = $actualRoute['controller'];
$method = $actualRoute['method'];
$data = isset($actualRoute['data']) ? $actualRoute['data'] : [];

$this->instantiateController($controller, $method, $data);
}

public function create(string $aliases, string $controllerAndMethod, string $type = "GET")
{
$arrayExplode = explode('@', $controllerAndMethod);
Expand Down Expand Up @@ -81,52 +100,34 @@ public function delete(string $aliases, string $controllerAndMethod)
* @param method String the method name
* @return method
*/
public function instantiateController(string $controller, string $method, array $data = [])
protected function instantiateController(string $controller, string $method, array $data = [])
{
# Verifying if exist the character \\ in Controller name
if (strstr($controller,'\\')) {
$stringToArray = explode('\\', $controller);
$controllerName = end($stringToArray);
$controllerNameWithfullNamespace = implode("\\", array_values($stringToArray));
$controller = "App\Controllers\\".$controllerNameWithfullNamespace;

} else {
$controllerName = $controller;
$controller = "App\Controllers\\".$controller;
}

/** @var Controller */
# Instanciate the Controller
$controller = new $controller;

$this->verifyIfMethodExists($controller, $method);

# Call the Controller Method
# data is empty
if (!count($data)) {
return call_user_func([$controller, $method]);
}

$data = explode('/', $data[0]);

# data is not empty
return call_user_func_array([$controller, $method], $data);
}

public function run()
{
$similarRoutes = $this->takesSimilarRoutes();
$similarRoutes = $this->takesRegexRoutes($similarRoutes);
$similarRoutes = $this->takesActualRouteByRegex($similarRoutes);
$similarRoutes = $this->takesRouteData($similarRoutes);
$similarRoutes = $this->takesRoutesSimilarToMethod($similarRoutes);

// pega a primeira rota
$actualRoute = current($similarRoutes);
$controller = $actualRoute['controller'];
$method = $actualRoute['method'];
$data = isset($actualRoute['data'])? $actualRoute['data']: [];

$this->instantiateController($controller, $method, $data);
}

/**
* Pega todas as rotas parecidas, ou seja,
* que possuem a mesma quantidade de barras.
Expand Down Expand Up @@ -213,6 +214,11 @@ protected function takesRouteData(array $similarRoutes): array
preg_match("/^{$route}/", $this->routerAliases, $match);
array_shift($match);
$data['data'] = $match;

// verifica se existe somente uma rota e ela possui barras
if (count($data['data']) === 1 && preg_match('/\//', $data['data'][0])) {
$data['data'] = explode('/', $data['data'][0]);
}
return $data;
}, $similarRoutes);
}
Expand Down Expand Up @@ -254,4 +260,19 @@ protected function manipulateRouteRegex(string $route, array $matches): string
}
return $route;
}

/**
* Verifica se o método atual existe naquele controller
*
* @param Controller $controller
* @param string $method
* @return void
*/
protected function verifyIfMethodExists(Controller $controller, $method): void
{
if (!method_exists($controller, $method)) {
require_once(__DIR__ . '/../../App/Views/Layouts/405.php');
exit;
}
}
}

0 comments on commit b0aca4f

Please sign in to comment.