Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
E ai pessoal, blz?
Seguinte, estou tentando entender como é feito a instanciação de classes com namespace dinâmico nos frameworks, ou seja, definidos pelo usuário.
Ex:
namespace MyApp/Controller;
class ExampleController { }
O framework quando instancia essa classe, precisa conhecer o namespace, mesmo utilizando autoload a classe precisa ser precedida pelo namespace correto? Qual a estratégia utilizada pra fazer isso?
Obrigado, Williams.
O funcionamento do namespace eu compreendo, vou tentar explicar melhor a dúvida. Estou tentando desenvolver um mini-framework, e estou sem saber como arquitetar esta parte de "autoload" das classes do usuário que o framework precisará instanciar.
Digamos que o usuário do framework criou e registrou no autoload seguindo as especificações (PSR-0 ou PSR-4) o controller abaixo:
namespace MyApp\Controller;
class ExampleController { }
O Framework irá identificar a url requisitada, por exemplo http://site.com.br/Example, está url diz ao framework que deverá instanciar a classe ExampleController. O framework então deveria fazer algo parecido com isso:
namespace MyFramework\Controller;
class FrontController {
public function init(){
$controller = $this->getControllerFromUrl(); // Recupera o nome do controller com base na url
$className = '\MyApp\Controller\' . $controller . 'Controller' // Define a classe a ser instanciada
new $className; // Instancia a classe do controller
}
}
Mas não posso colocar explicitamente no código qual o namespace será usado, pois pretendo deixar que o usuário do framework fique livre para colocar o namespace que ele quiser em seus controllers. então eu preciso fazer de uma forma que funcione assim:
namespace MyFramework\Controller;
class FrontController {
public function init(){
$controller = $this->getControllerFromUrl(); // Recupera o nome do controller com base na url
$className = $controller . 'Controller' // Define a classe a ser instanciada
$namespace = $this->getNamespace($className); // Reconhecendo de alguma forma o namespace
new $namespace.$className; // Instancia a classe do controller
}
}
Bom.. não sei se fui claro, mas é isso ai. Preciso fazer algo próximo a isso, de alguma forma preciso saber qual o namespace definido pelo usuário. Ideias?
Agora ficou mais clara, estou meio a 48 horas sem dormir rsrsrs,
Basicamente você quer criar é uma router, se quiser eu posto um exemplo que tenho aqui, mas é estática, só para você compreender a logica, mas e mesma coisa que da um explode na url, para pega o controller, action e os params, mas não dou suporte. ;)
Olá, Williams. 48 horas sem dormir? Tenso... rsrsrs
Deixa eu ver se entendi, nesse caso do router, o usuário teria que prencher uma rota para cada controller que ele criasse, correto? Algo assim:
$router = new Router();
$router->add("/Example", "\MyApp\Controller\ExampleController");
$router->add("/Single", "\MyApp\Controller\SingleController");
A solução é boa, acho que a maioria dos frameworks funciona assim, mas queria algo mais dinâmico, sem que o usuário tivesse que criar esse arquivo de rotas, o framework de alguma forma "mágica" já reconheceria isso... Será que é possível?Olá, Williams. 48 horas sem dormir? Tenso... rsrsrs
;)
>
A solução é boa, acho que a maioria dos frameworks funciona assim, mas queria algo mais dinâmico, sem que o usuário tivesse que criar esse arquivo de rotas, o framework de alguma forma "mágica" já reconheceria isso... Será que é possível?
Sim é possível, já discutimos sobre esta questão de uma router dinâmica, de uma olhada no link abaixo
http://forum.imasters.com.br/topic/518205-friendly-url-no-mvc/
Acredito que possa lhe ajudar, os scripts que tenho que te falei, saiu desta troca de ideias.
Valeu Williams!
Vou dar uma olhada no post e pesquisar mais um pouco a respeito. Obrigado pela ajuda!
Namespace é como uma máscara para um diretório
A comunidade PHP adotou alguns padrões com regras bem específicas e conhecidas como PSR-0 e PSR-4 .
Para carregar automaticamente as classes, utiliza-se a função spl_autoload_register que é compatível com os padrões acima.
Para carregar a classe ExampleController, usasse o namespace, precedida de barra invertida.
Exemplo:
\MyApp\Controller\ExampleController
Mas você pode apelidar o namespace onde a classe será incluída, para não ficar tão longa o caminho, para isso tem a função use
use MyApp\Controller\ExampleController as ExampleController
e utilizar a classe normalmente
$str = new ExampleController();
Basicamente é isso!