Parte 1 - Utilizando Estrutura MVC em PHP

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 15

UtilizandoestruturaMVCemPHP

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!

Você também pode gostar