Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Prove Yourself

Minha implementação do Front Controller

Recommended Posts

Boa tarde, criei meu Front Controller e tenho certeza que ele pode melhorar muito. Uma coisa que não estou satisfeito é esse amontoado de returns. Isso é deselegante, certo?

 

O usuário digita um endereço e o objeto obtém o controller e o método requisitados. Se o controller não existir, é chamado um controller padrão (definido previamente).

 

Alguém pode me opinar? Obrigado.

<?php
class FrontController {
	private $controller;
	private $method;
	private $parameters;
	private $defaultController;
	private $defaultMethod;
	
	public function __construct() {
		if(isset($_GET['controller']) && !empty($_GET['controller'])) {
			$this->controller = $_GET['controller'];
			unset($_GET['controller']);
		}
		
		if(isset($_GET['method']) && !empty($_GET['method'])) {
			$this->method = $_GET['method'];
			unset($_GET['method']);
		}
		
		$this->parameters = !empty($_GET) ? $_GET : array();
	}
	
	public function setDefaultController($defaultController) {
		$this->defaultController = $defaultController;
	}
	
	public function setDefaultMethod($defaultMethod) {
		$this->defaultMethod = $defaultMethod;
	}
	
	public function run() {
		if(!empty($this->controller)) {
			if(class_exists($this->controller)) {
				$controllerInstance = new $this->controller();
				
				if(!empty($this->method)) {
					if(method_exists($controllerInstance, $this->method)) {
						call_user_func_array(array($controllerInstance, $this->method), $this->parameters);
					}
					else {
						return false;
					}
				}
				else {
					call_user_func_array(array($controllerInstance, 'index'), $this-parameters);
				}
				
				return true;
			}
			else {
				return false;
			}
		}
		else {
			if(!empty($this->defaultController) && !empty($this->defaultMethod)) {
				$controllerInstance = new $this->defaultController();
				call_user_func_array(array($controllerInstance, $this->defaultMethod), $this-parameters);
				
				return true;
			}
			else {
				return false;
			}
		}
	}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prove, antes de falarmos do seu código, vou sugerir que você dê uma lida nos tópicos desse curso http://forum.imasters.com.br/public/style_emoticons/default/seta.gif PHP Orientado a Objetos

 

A sugestão de leitura é para que, as sugestões que surgirem aqui, sejam facilmente compreendidas.

 

Uma coisa que não estou satisfeito é esse amontoado de returns. Isso é deselegante, certo?

 

Veja bem, seria feio sim se cada return retornasse uma coisa diferente, porém, todos os seus returns retornam exatamente a mesma coisa, um boolean, então, não vejo como deselegante.

 

Contudo, você conseguiria simplificar, definindo uma variável com um valor padrão e modificando essa variável conforme a situação, dessa forma, você conseguiria ter apenas 1 return, no final do código.

 

Caso tenha compreendido os tópicos iniciais de PHP Orientado a Objetos, volte a postar para que possamos falar sobre os padrões de projeto relacionados ao seu problema e como utilizá-los adequadamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem nenhum framework em php que trabalhe com frontcontroller nao? nativamente?

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem nenhum framework em php que trabalhe com frontcontroller nao? nativamente?

Abs

 

Acho que todos os principais trabalham, mas com certeza o Zend Framework trabalha.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

@João Batista Neto, já li tudo. Na verdade ainda não tinha entendido muito bem QUANDO usar Interfaces. Entendo que interfaces são sobre comportamentos.

Parabéns pelo conteúdo. Muito bem escrito, muito didático!

 

@kisuke, existem vários frameworks que implementam este padrão. Estou apenas implementando para estudar, nada mais.

 

E agora @João Batista Neto, podemos continuar a analisar a situação?

Obrigado.

 

Agora estou em dúvida. O FrontController instancia o controller da requisição e chama o método ou isso é tarefa de outro objeto? Quanto mais leio, menos entendo :S

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.