Parte 1 - Utilizando Estrutura MVC em PHP
Parte 1 - Utilizando Estrutura MVC em PHP
Parte 1 - Utilizando Estrutura MVC em PHP
Parte1
17setembro,2014 LuizOtvioMiranda
VejacomocriarumaaplicaocomestruturaMVCemPHP.
Vamoscriarumsistemasimples,comusurios,permisseseum
sistemadenotciasbsico.
SevocdesenvolvehalgumtempoemPHP,provavelmentejdeveter
pensadoemqualseriaamelhorformaparaorganizarseusarquivos.Talvez
attenhaencontradoumasoluoejestutilizandosuaprpriaestrutura
depastasearquivos,ouumframeworkquefaaissoporvocpara
beneficiaroseusistema.
NesseartigovouexplicarcomocriarseuprprioframeworkcompadroMVC
emPHP.Claroquenoserumsistemaextremamenteavanado,masser
umagrandeintroduoparalheajudaradesenvolveraplicativosdemaneira
maisorganizadaeutilizandoProgramaoOrientadaaObjetos.
Entovamosl!
1OqueMVC?
2Nossoprojeto
3Estruturadepastas
4ModelodaURLeparmetros
5BasededadosdomodeloMVCemPHP
6Criandooarquivo.htaccess
7index.php
8config.php
9loader.php
10functions/globalfunctions.php
11Download
12Outraspartesdoartigo
OqueMVC?
MVCsignificaModelViewController(ModeloVisoControlador)e
ummodelodaarquiteturadesoftwarequetemafunodesepararfrontend
(queousuriov)dobackend(queomotordaaplicao).
AestruturaMVCfuncionadaseguintemaneira:
Model(modelo)OModelresponsvelportratardetudoque
relacionadocomosdados,comocriar,ler,atualizareexcluir
valoresdabasededados(CRUD),tratardasregrasdenegcios,
dalgicaedasfunes.Apesardefazerissotudo,oModelno
apresentanadanatelaenoexecutanadaporsi.Normalmente,
umViewrequisitaquedeterminadoModelexecuteumaaoea
mesmaexecutadadentrodoView.
View(Viso)OViewapartequeousuriovnatela,como
HTML,JavaScript,CSS,Imagenseassimpordiante.OViewno
temnenhumaao,masrequisitaqueoModelexecutequalquer
aoemostraosvaloresretornadosparaousurio.importante
ressaltarqueumViewnodependedenenhumModel,por
exemplo,sevocvaiapenasexibirdadosHTMLnatela,enovai
precisardebasededados,talvezumModelnosejanecessrio.
Controller(Controlador)OControllerresponsvelporresolver
seumModele/ouumViewnecessrio.Casopositivoeleincluir
osarquivosefunesnecessriasparaosistemafuncionar
adequadamente.
VejaumaimagemrepresentandocomoomodeloMVCfunciona:
Modelviewcontroller(MVC)
Naimagemacima,aslinhasslidasexemplificampartesquetmligaes
diretasaslinhastracejadasmostramligaesindiretas.Issomalevele
podevariardependendodasuaaplicaoeaoqueestsendoexecutada.
Nossoprojeto
Nossoprojetosercriarumsistemadenotciascomreaadministrativa,
portanto,obrigatrioquetenhamososeguinte:
Sistemadeloginparaosadministradores
Sistemaderegistrodeusurios(CRUD)
Sistemadepermisses
Sistemadecadastrodenotcias(CRUD)
FaremostudonomodeloMVC,masparaatingirnossoobjetivoteremosque
criarvriasoutraspastasearquivos.
Basicamente,nossaestruturaficarcomonaimagemabaixo:
FluxogramadanossaaplicaoMVCemPHP
Naimagemacimatemosumaapresentaodecomoainformaovai
passarpelonossosistema.Vejaumadescrio:
1. Ousurioacessaosite
2. Oarquivoindex.phpapenasincluioarquivoconfig.php
3. Oarquivoconfig.phpresponsvelporregistrarnossas
configuraesecarregaroarquivoloader.php
4. Oarquivoloader.phpcarregaoarquivoglobalfunctions.php,
queresponsvelpormantertodasasfunesglobais.Na
verdade,afunomaisimportantequetemosalia_autoload,
paracarregarclassesautomaticamente.Eletambmresponsvel
porinstanciaraclasseTutsupMVCquevaicontrolartodooincio
daaplicao.
5. AclasseTutsupMVCvaiverificarseumcontroladorfoi
requisitado(pelaURL)eincluiromesmo.Elatambmvaiverificar
sealgumaaodocontroladorfoirequisitada(aindapelaURL).
Casocontrrio,aaoindexdocontroladorserexecutada.
Sendoassim,todocontroladortemqueterpelomenosumaao,
chamadadeindex.
6. Oarquivocontrolador(controller)responsvelportertodasas
aesdaquelasesso.Cadaaoirdiferenciar
osModelse/ouViewsqueforemrequisitados.svezesumaao
podeutilizarumViewevriosModels,ouviceversa
7. Oarquivomodelo(model)tertodasosmtodosnecessriospara
executarasaesdoView.Estearquivonoobrigatrio
8. Oarquivodeviso(view)irsimplesmentemostrartudoao
usurioquerequisitouaao.
Estruturadepastas
Nossaspastasficarodaseguintemaneira:
.htaccess
config.php
index.php
loader.php
classes
classMainController.php
classMainModel.php
classPasswordHash.php
10
classTutsupDB.php
11
classTutsupMVC.php
12
classUserLogin.php
13
14
controllers
15
homecontroller.php
16
logincontroller.php
17
noticiascontroller.php
18
userregistercontroller.php
19
20
functions
21
globalfunctions.php
22
23
includes
24
404.php
25
26
models
27
noticias
28
noticiasadmmodel.php
29
30
userregister
31
userregistermodel.php
32
33
views
34
home
35
homeview.php
36
37
login
38
loginview.php
39
40
noticias
41
noticiasadmview.php
42
noticiasview.php
43
44
userregister
45
userregisterview.php
46
47
_css
48
style.css
49
50
_images
51
_includes
52
footer.php
53
header.php
54
menu.php
55
56
_js
57
html5.js
58
scripts.js
59
60
_uploads
61
_utilitarios
62
db.sql
63
fluxograma.jpg
64
mvc.jpg
Aspastasquetmum_sublinhadoantesdonome,sopastasqueincluem
arquivosqueosviewsutilizam,masquenosoviews.Normalmenteso
arquivosquenosoacessadosdiretamente,
comoheader.php,footer.phpeoutros.Elessoincludosnosarquivosque
precisamos.
Aodecorrerdessecurso,podeserqueeuadicioneouremovarecursos,mas
nosepreocupe,voulhedizerquandoalgoforalterado.
ModelodaURLeparmetros
VamosobtertodososnossosparmetrosporHTTPGETnoseguinte
formato:
http://www.exemplo.com/index.php?
url=controlador/ao/parametro1/parametro2/etc
Sevocperceber,temosapenasumparmetronaURLacima,
o$_GET[url].Issoporquevamosutilizaroarquivo.htaccessdoApachepara
reescreveraURL.
AmesmaURLacimaficarassim:
http://www.exemplo.com/controlador/ao/parametro1/parametro2/etc
NossaclasseTutsupMVCvaitratardesepararocontrolador,aao,e
enviarorestantedosparmetrosparaosmtodosdoscontroladores.
BasededadosdomodeloMVCemPHP
PrecisaremosdeumabasededadoschamadaTutsup:
1
CREATEDATABASEIFNOTEXISTS`tutsup`CHARACTERSETutf8;
Umatabelachamadausers:
1
CREATETABLEIFNOTEXISTS`tutsup`.`users`(
`user_id`INT(11)NOTNULLAUTO_INCREMENT,
`user`VARCHAR(255)COLLATEutf8_binNOTNULL,
`user_password`VARCHAR(255)COLLATEutf8_binNOTNULL,
`user_name`VARCHAR(255)COLLATEutf8_binDEFAULTNULL,
`user_session_id`VARCHAR(255)COLLATEutf8_binDEFAULTNULL
`user_permissions`LONGTEXTCOLLATEutf8_bin,
PRIMARYKEY(`user_id`)
)ENGINE=MYISAMAUTO_INCREMENT=0DEFAULTCHARSET=utf8COLLATE
Umatabelachamadanoticias:
1
CREATETABLEIFNOTEXISTS`tutsup`.`noticias`(
`noticia_id`INT(11)NOTNULLAUTO_INCREMENT,
`noticia_data`DATETIMEDEFAULT'0000000000:00:00',
`noticia_autor`VARCHAR(255),
`noticia_titulo`VARCHAR(255),
`noticia_texto`TEXT,
`noticia_imagem`VARCHAR(255),
PRIMARYKEY(`noticia_id`)
)ENGINE=MYISAMCHARSET=utf8;
PrecisaremosinserirumusuriochamadoAdminnabasededados.
Osdadosdousurioinicialsero:
Usurio:Admin
Senha:admin
Nossosistemafazdistinoentreletrasmaisculaseminsculas.
1
INSERTINTO`tutsup`.`users`(
`user_id`,
`user`,
`user_password`,
`user_name`,
`user_session_id`,
`user_permissions`
VALUES
10
11
NULL,
12
'Admin',
13
'$2a$08$2sGQinTFe3GF/YqAYQ66auL9o6HeFCQryHdqUDvuEVN0J1vdhimii'
14
'Admin',
15
'ljfp99gvqm2hg2bj6jjpu4ol64',
16
17
);
'a:2:{i:0;s:13:\"userregister\";i:1;s:18:\"gerenciarnoticias\";}'
Sevocquiseroscriptcompleto,bastacriarumarquivocomaextenso
.sql,comoseguintetexto:
1
CREATEDATABASEIFNOTEXISTS`tutsup`CHARACTERSETutf8;
CREATETABLEIFNOTEXISTS`tutsup`.`noticias`(
`noticia_id`INT(11)NOTNULLAUTO_INCREMENT,
`noticia_data`DATETIMEDEFAULT'0000000000:00:00',
`noticia_autor`VARCHAR(255),
`noticia_titulo`VARCHAR(255),
`noticia_texto`TEXT,
`noticia_imagem`VARCHAR(255),
10
PRIMARYKEY(`noticia_id`)
11
)ENGINE=MYISAMCHARSET=utf8;
12
13
CREATETABLEIFNOTEXISTS`tutsup`.`users`(
14
`user_id`INT(11)NOTNULLAUTO_INCREMENT,
15
`user`VARCHAR(255)COLLATEutf8_binNOTNULL,
16
`user_password`VARCHAR(255)COLLATEutf8_binNOTNULL,
17
`user_name`VARCHAR(255)COLLATEutf8_binDEFAULTNULL,
18
`user_session_id`VARCHAR(255)COLLATEutf8_binDEFAULTNULL
19
`user_permissions`LONGTEXTCOLLATEutf8_bin,
20
PRIMARYKEY(`user_id`)
21
)ENGINE=MYISAMAUTO_INCREMENT=0DEFAULTCHARSET=utf8COLLATE
22
23
INSERTINTO`tutsup`.`users`(
24
`user_id`,
25
`user`,
26
`user_password`,
27
`user_name`,
28
`user_session_id`,
29
`user_permissions`
30
31
VALUES
32
33
NULL,
34
'Admin',
35
'$2a$08$2sGQinTFe3GF/YqAYQ66auL9o6HeFCQryHdqUDvuEVN0J1vdhimii'
36
'Admin',
37
'ljfp99gvqm2hg2bj6jjpu4ol64',
38
39
);
'a:2:{i:0;s:13:\"userregister\";i:1;s:18:\"gerenciarnoticias\";}'
UtilizequalquerprogramadegerenciamentodebasededadosMySQLpara
importarestescript.
SequiserutilizarophpMyAdmin,jcriarumtutorialpravoc:
CrietabelasebasesdedadosnophpMyAdminAula27
Vejaumaimagemdaminhabasededadosjpronta:
Tabelaparanossaaplicao
bemsimples.
Criandooarquivo.htaccess
Crieumapastacomonomedonossoaplicativo(nomeucasocrud),em
seguidaabraseueditordetextospreferidoecrieumarquivo
chamado.htaccess:
Neleadicioneoseguinte:
1
RewriteEngineOn
RewriteCond%{REQUEST_FILENAME}!d
RewriteCond%{REQUEST_FILENAME}!f
RewriteCond%{REQUEST_FILENAME}!l
RewriteRule^(.+)$index.php?path=$1[QSA,L]
Estearquivodeverficarnapastaprincipaldanossaaplicao.Vejaum
exemplodomeusistema(jpronto):
.htaccess
EstearquivovaipermitirquenossasURLssejamescritasdessamaneira:
http://www.exemplo.com/index.php?
url=controlador/ao/parametro1/parametro2/etc
Para:
http://www.exemplo.com/controlador/ao/parametro1/parametro2/etc
SevocnoquiserutilizarorecursodoApache,bastaseguiroprimeiro
exemplodaURL.
Vejaumaimagemdoarquivo.htaccess:
.htaccess
index.php
Nossoarquivoprincipal,oindex.php,terapenasoseguinte:
1
<?php
//Config
require_once'config.php';
?>
Maisnada
config.php
Nossoarquivoconfig.phpterasconfiguraesquevocpodealterarpara
cadaumdeseusprojetos,comoconfiguraesdeURL,basededados,
debug,eassimpordiante,veja:
1
<?php
/**
*Configuraogeral
*/
//Caminhoparaaraiz
define('ABSPATH',dirname(__FILE__));
//Caminhoparaapastadeuploads
10
define('UP_ABSPATH',ABSPATH.'/views/_uploads');
11
12
//URLdahome
13
define('HOME_URI','http://127.0.0.1/Cursos/crud');
14
15
//Nomedohostdabasededados
16
define('HOSTNAME','localhost');
17
18
//NomedoDB
19
define('DB_NAME','tutsup');
20
21
//UsuriodoDB
22
define('DB_USER','root');
23
24
//SenhadoDB
25
define('DB_PASSWORD','');
26
27
//CharsetdaconexoPDO
28
define('DB_CHARSET','utf8');
29
30
//Sevocestiverdesenvolvendo,modifiqueovalorparatrue
31
define('DEBUG',true);
32
33
/**
34
*Noeditedaquiemdiante
35
*/
36
37
//Carregaoloader,quevaicarregaraaplicaointeira
38
require_onceABSPATH.'/loader.php';
39
?>
Percebaqueestearquivotambmcarregaoarquivoloader.php(veremos
seucontedoabaixo).
loader.php
Oarquivoloader.phpiniciaasesso,configuraoserros(dependendoda
constanteDEBUG)eincluiumarquivocomfunesglobais.
Veja:
1
<?php
//Evitaqueusuriosacesseestearquivodiretamente
if(!defined('ABSPATH'))exit;
//Iniciaasesso
session_start();
//Verificaomodoparadebugar
if(!defined('DEBUG')||DEBUG===false){
10
11
//Escondetodososerros
12
error_reporting(0);
13
ini_set("display_errors",0);
14
15
}else{
16
17
//Mostratodososerros
18
error_reporting(E_ALL);
19
ini_set("display_errors",1);
20
21
22
23
//Funesglobais
24
require_onceABSPATH.'/functions/globalfunctions.php';
25
26
//Carregaaaplicao
27
$tutsup_mvc=newTutsupMVC();
VejaqueestearquivotambminiciaaclasseTutsupMVC,elavaiprocurar
ocontroladoreaao.Vocvaiverseucontedonaprximaaula.
Oloader.phpcarregaoarquivo/functions/globalfunctions.php,vamos
verseucontedo.
functions/globalfunctions.php
Estearquivocarregaduasfunesmuitoimportantesparanossaaplicao,
veja:
1
<?php
/**
*Verificachavesdearrays
*Verificaseachaveexistenoarrayeseelatemalgumvalor.
*Obs.:Essafunoestnoescopoglobal,pois,vamosprecisarmuitodamesma.
*@paramarray$arrayOarray
*@paramstring$keyAchavedoarray
10
*@returnstring|nullOvalordachavedoarrayounulo
11
*/
12
functionchk_array($array,$key){
13
//Verificaseachaveexistenoarray
14
if(isset($array[$key])&&!empty($array[$key]
15
//Retornaovalordachave
16
return$array[$key];
17
18
19
//Retornanuloporpadro
20
returnnull;
21
}//chk_array
22
23
/**
24
*Funoparacarregarautomaticamentetodasasclassespadro
25
*Ver:http://php.net/manual/pt_BR/function.autoload.php.
26
*Nossasclassesestonapastaclasses/.
27
*OnomedoarquivodeverserclassNomeDaClasse.php.
28
*Porexemplo:paraaclasseTutsupMVC,oarquivovaichamarclassTutsupMVC.php
29
*/
30
function__autoload($class_name){
31
32
33
if(!file_exists($file)){
34
require_onceABSPATH.'/includes/404.php';
35
return;
36
37
38
39
require_once$file;
40
}//__autoload
$file=ABSPATH.'/classes/class'.$class_name.'.php'
//Incluioarquivodaclasse
Asaesdasfunesestodescritasnocdigoacima.
Download
Sevocquiserbaixartudooquejfoifeitoatagora,segueolink:
Downloadcrud10.zip
Casoqueiracontribuircomoprojeto,acessonoGithub:
luizomf/TutsupMVC
Percebaqueoarquivoquevocbaixouacimaestmuitomaisadiantadodo
queesteartigo,porm,aindavamoschegarl,bastavocacompanhar
oTutsup.
Outraspartesdoartigo
Esteartigoestdivididoemvriaspartes,poisseucontedomuitoextenso.
Tambmexisteumacategoriaexclusivaparatodoseucontedo,chamada
deMVCemPHP.
Vejatodasassuaspartesjpublicasnoslinksabaixo:
UtilizandoestruturaMVCemPHPParte1
UtilizandoestruturaMVCemPHPParte2
UtilizandoestruturaMVCemPHPParte3
UtilizandoestruturaMVCemPHPParte4
UtilizandoestruturaMVCemPHPParte5
Emcasodedvidas,comentea!