Created
January 20, 2018 23:05
-
-
Save Wpkenpachi/136f2a7bc0b07aa9e2749a9fe9b9fefa to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Injeção de dependência em namespaces Diferentes | |
*/ | |
// Request Class | |
namespace Illuminate\Http; | |
class Request { | |
public $a = 1; | |
public function get($a){ | |
return $this->a + $a; | |
} | |
} | |
// ============================================ | |
// Controller | |
namespace App\Controllers; | |
use Illuminate\Http\Request; | |
class UserController { | |
public function store(Request $request){ | |
return $request->get(1); | |
} | |
} | |
class PostController { | |
public function store(Request $request, $id){ | |
return $request->get(1); | |
} | |
} | |
// ============================================ | |
// Rotas do sistema | |
$rotas = [ | |
[ | |
'url' => 'home', | |
'controller' => 'App\Controllers\UserController', | |
'action' => 'store' | |
], | |
[ | |
'url' => 'posts', | |
'controller' => 'App\Controllers\PostController', | |
'action' => 'store' | |
] | |
]; | |
// ============================================ | |
// Processamento de chamada de rotas | |
namespace Root; | |
/* Função que | |
1 - Encontra a compatível com a rota chamada, caso encontre :> | |
2 - Instancia um objeto do controller dessa rota | |
3 - Obtém o método (action) chamado pelo controller da rota | |
4 - Obtém os parâmetros deste método | |
5 - Percorre os parâmetros deste método | |
6 - Obtém o nome do parâmetro | |
7 - Obtêm o tipo do parâmetro | |
8 - Se o parâmetro for do tipo de alguma classe previamente declarada | |
9 - É instanciado um objeto deste tipo e salvo em um array | |
10 - Se for um parâmetro sem tipo, o valor nulo é atribuido ao array. | |
11 - Após percorrer os parâmetros da action, fazemos uma chamada | |
à action do controller da rota em questão, passando o array | |
como parâmetro pra este método e retornando o resultado da execução do método. | |
*/ | |
function callRoute($url){ | |
global $rotas; | |
$index = array_search($url, array_column($rotas, 'url')); // 1* | |
$controller; // Declarando variável controller | |
$action; // Declarando variável action | |
$method; // Declarando variável méthod | |
$parameters; // Declarando variável parameters | |
$classes = []; // Declarando array classes | |
if( $index >= 0 ){ // Se existir algum match | |
$controller = $rotas[ $index ][ 'controller' ]; | |
$action = $rotas[ $index ][ 'action' ]; | |
$class = new \ReflectionClass( $controller ); // 2* | |
$method = $class->getMethod( $action ); // 3* | |
$parameters = $method->getParameters(); // 4* | |
foreach($parameters as $param){ // 5* | |
$paramName = $param->getName();// 6* | |
$paramType = ($a = $param->getClass()) ? $a->name : null; // 7* | |
if( in_array($paramType, get_declared_classes()) ){ // 8* | |
$classes[] = ($a = new $paramType) ? $a : null; // 9* | |
}else{ | |
$classes[] = null; // 10 * | |
} | |
} | |
} | |
echo call_user_func_array([$controller, $action], $classes); // 11* | |
} | |
// Chamando uma rota | |
callRoute('posts'); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment