Skip to content

Instantly share code, notes, and snippets.

@Wpkenpachi
Created January 20, 2018 23:05
Show Gist options
  • Save Wpkenpachi/136f2a7bc0b07aa9e2749a9fe9b9fefa to your computer and use it in GitHub Desktop.
Save Wpkenpachi/136f2a7bc0b07aa9e2749a9fe9b9fefa to your computer and use it in GitHub Desktop.
<?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