Ir para conteúdo

POWERED BY:

Arquivado

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

stvkoch

[Resolvido] Construindo seu próprio Framework MCV

Recommended Posts

Viva,

 

Neste artigo irei explicar como construir um framework que aulixilia a criação de webapps com Design Pattern MCV.

 

Este framework é construído por um design pattern que chamarei de 'Spin Pattern'.

 

Ele não tem tantos recursos comparado com outros frameworks por não ter a infinidade de arquivos adicionais

que auxiliam algumas tarefas. Mas com o tempo, voce ira criando suas próprias bibliotecas auxiliares e adicionará ao seu framework

 

Iremos nesta primeira parte nos concentramos no C e V. Controller e Visualização.

 

Primeiro passo é criar um directorio onde guardará seu ficheiros. Para este projecto iremos chamar o directorio de 'snapsframework'.

 

 

Criaremos nossa primeira classe chamada BaseController e a guardaremos em basecontroller.php.

 

class BaseController{
		//propriedade que guarda o nome do layout padrão
		public $layout = 'layout';
		//propriedade que guarda o nome da action que é executada por default
		public $actiondefault = 'index';
		//imprime o conteudo do controller
		function __construct(){
			echo $this->{$this->layout}();
		}
		//função que é sobrecarregada pelo mytemplate! Mais adiante iremos sobrecarrega-la
		public function layout(){
			return $this->showcontent();
		}
		//function que gera o conteudo da action
		public function showcontent(){
			return $this->{$this->runaction()}();
		}
		public function runaction(){
			return  (isset($_REQUEST['a'])) ? $_REQUEST['a'] : $this->actiondefault;
		}
	}

 

Agora iremos construir o arquivo que receberá as requisições:

o index.php

 

Arquivo que recebe as requisições. index.php

 

function __autoload($class_name) {
		require_once strtolower($class_name) . '.php';
	}
	if(!isset($_REQUEST['c']) || $_REQUEST['c'] == null)
		$_REQUEST['c'] = 'home';

 

Cuidado, o __autoload pode abrir os controller passado pelo url, ou qualquer classe que exista.

Por este motivo é verificado se $_REQUEST['c] é um controller

 

if(file_exists(strtolower($_REQUEST['c']).'controller.php')){
		require_once (strtolower($_REQUEST['c']).'controller.php');
		$classe = ucfirst($_REQUEST['c']).'Controller';
		$controler = new $classe;
	}else
		die($_REQUEST['c'] . ' Não há este controller.');

 

Agora o sistema esta funcionando e executando as solicitações de actions para seus controllers.

 

Vamos criar nosso primeiro controller chamado HomeController e guarda-lo em homecontroller.php

 

class HomeController extends BaseController{
		public function index(){
			return "Meu arquivo HOME executando a action INDEX";
		}
		public function vamos(){
			return 'OK----Vamos para a HOME!';
		}
	}

Se ires ao endereço: http://localhost/snapsframework/ ira executar a action index do controller home,

se ires http://localhost/snapsframework/?a=vamos irá executar a action vamos do controller HomeController

que é passado no index como controller default.

 

O endereço completo da url é http://localhost/snapsframework/?c=home&a=vamos

 

 

OK iremos agora para o View!!

 

Crie uma nova classe chamada MyTemplate que será expandida pela BaseController.

 

class MyTemplate extends BaseController{
		//Posso renomear meu layout padrão, por exemplo para layout2 e o template chamado será o contido no método layout2()
		//$layout = "layout2";
		public function layout(){
			include('views/layout/template.php');
		}
		public function layout2(){
			include('views/layout/template2.php');
		}
	}

!!!Note que nosso método layout retorna um include chamado 'template.php' que esta dentro do directorio 'view/layout'

Crie estes directórios e o arquivo template.php com o conteúdo(Poderia inserir o HTML dentro da função layout, mas não fica elegante):

 

<code>
		<html>
			<head>
				<meta http-equiv="Content-type" content="text/html; charset=utf-8">
				<title>My Template</title>
		
			</head>
			<body id="template">
				<?php #pode incluir elementos usando include('views/elements/menu.php') ?>
		
		
				<!--Mas oque que é importante neste template é esta função $this->showcontent() que retorna os dados do action-->
				<?php echo $this->showcontent() ?>
		
		
			</body>
		</html>
	</code>

 

Até ai, tudo bem, mas como nossas classes controller sabem qual o layout a usar?

Para usarmos nosso template temos que expandir nossos controller por nosso template

 

no caso de nosso HomeController ficaria assim:

 

class HomeController extends MyTemplate{
		//Posso alterar o layout padrão de meu MyTemplate
		//var $layout = 'layout2';
		public function index(){
			//...
		}
		public function vamos(){
			//...
		}
	}

 

Ai esta...

Nosso CV de nosso framework MCV prontos.

 

 

Iremos em breve tratar de nosso M, que será nosso modelo de acesso aos dados.

 

há muitas coisas que poderiam expandir este framework, como adicionar um arquivo Rewrite para o Apache e um Mapper para tratar de nossas URLs a nivel do BaseController, mas para já fica fora do escopo deste artigo.

 

 

 

 

O código pode ser visto em: http://github.com/stvkoch/snaps-framework/tree/master

 

 

 

 

Qualquer dúvida entrem em contacto.

 

Abraço ate mais.

 

stevenkoch(at)surfih.com

 

http://www.surfih.com/surfer/stvkoch

 

http://inov.es

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.