PHP.EE FOORUM   
Nimi:   Pass:   Mäleta mind! 
   Teemad | php.ee esilehele | registreeri | Märgi kõik teemad loetuks | #php.ee Skype vestlus | RSS
UUS TEEMA  OTSI  Lehekülgi: 1
MVC Controller design
Postitaja: koodineeger(R) 2015-05-28 12:30:42
Tere,

tegelen ühe veebirakendusega,
aluseks on võetud MVC muster

Nagu selles valdkonnas kohane,
tegelen ilmselt taas jalgratta leiutamisega,
aga ega teistmoodi asjale vist pihta ei saa

Kasutan namespace ja __autoload võimalusi,
kõik klassid on mustriga namespace = folder,
class = file ehk ( '%s.php', __CLASS__ )

Model (M) tegemine tundub kõige arusaadavam
ja see on mul tegelikult juba tehtud

View (V) ja Controller (C) on ka mingil määral tehtud,
kuid alles algstaadiumis - parima lahenduse otsinguil


Mu küsimus ei olegi niivõrd tehniline, pigem põhimõtteline:

Controlleri kohta:

1) kas teha Controller class (file) per action? namespace määrab kausta struktuuri

2) kui actionid grupeerida ühte klassi/faili, siis millistel alustel?


Tavalise GET päringuga on asi lihtne,
GET päring käib läbi ruuteri,
saab teada Controller klassi ja meetodi,
kontrolleri klassi meetodis küsitakse Modelilt andmed
ja saadetakse need View'le renderdamiseks

Sisuliselt kogu parameetri info asub aadressis (urlis)


Controller vs View kohta:

Erinevalt GET päringust, saan View templates teha ajax POST päringu,
mis võib sisaldada kogu päringut või siis minimaalset vajalikku päringut

Minimaalne POST päring sisaldab identifikaatorit ruuteri jaoks,
kuvatava kande id jms.

nt: data: {controller: "photo", method: "details", id: "247"}

photo::details meetodis on päring(ud) model poole, mitmus seepärast, et võibolla kuvatakse ka seotud fotod jms.
saadud sisu Modelist (object või array) saadetakse View templatesse

Sellises olukorras tekib mul palju erinevaid kontrollereid


Teine variant on, et mul on nn "universaalne kontroller", kuid View's on päring oluliselt detailsem, kus kirjas kõik, mida controller peaks tegema

nt: data: {controller: "photo", method: "details", params: {id: "247"}, include: {related: {controller: "photo", method: "related", base: "247", template: "listing/compact"}}, template: "custom/fancy"}

See on suht lamp näide, võib pisut vigane olla

selles näites on päring Model meetodi pihta
$obj = new Model\photo();
$View -> details = $obj -> details (247);

täiendav kraam
$objRelated = new Model\photo();
$View -> related = $objRelated -> related(247)
$htmlRelated = $View -> render ("listing/compact");

$View -> render ("custom/fancy");


Ehk mu teine küsimus, kas on mõistlik teha nn universaalne controller POST päringute jaoks ja detailne päring View'sse

mõned mõtted:

a) turvalisuse mõttes hoiaks kliendile nähtava/muudetava (view) minimaalse
b) hardcoditud scope controlleris ei lubaks süsteemis mujale kolama minna, sh. muuta/resettida kasutaja parooli


Tänud, kes viitsib reageerida


RE: MVC Controller design
Postitaja: Poiss 2015-05-28 14:43:04
>kontrolleri klassi meetodis küsitakse Modelilt andmed
>ja saadetakse need View'le renderdamiseks

See on vale. Kontroller ei istu view ja modeli vahel. Kontrolleri ülesandeks on viia model sellisesse staatusesse, mille pealt view saab oma pildi ära joonistada. View võib otse modelist asju küsida. Controller otsustab mudelist saadud vastuste põhjal, millist viewd näidata.

Aga mis su üldisemasse küsimusesse puutub, siis tavaliselt tehakse controller klass ja sinna sisse action meetodid. Päringus ütled nii controlleri kui actioni... Näiteks controller=user&action=login.

Ehk oli abi.
RE: MVC Controller design
Postitaja: rtfm 2015-05-28 16:39:45
ja tegeled sa selle jalgratta leiutamisega mille pärast? et õppida?
RE: MVC Controller design
Postitaja: koodineeger(R) 2015-05-28 17:23:38
TSITEERITUD:
>kontrolleri klassi meetodis küsitakse Modelilt andmed
>ja saadetakse need View'le renderdamiseks

See on vale. Kontroller ei istu view ja modeli vahel. Kontrolleri ülesandeks on viia model sellisesse staatusesse, mille pealt view saab oma pildi ära joonistada. View võib otse modelist asju küsida. Controller otsustab mudelist saadud vastuste põhjal, millist viewd näidata.

Aga mis su üldisemasse küsimusesse puutub, siis tavaliselt tehakse controller klass ja sinna sisse action meetodid. Päringus ütled nii controlleri kui actioni... Näiteks controller=user&action=login.

Ehk oli abi.


ma ei ole päris nõus väitega, et view otse modelist andmeid küsib, võibolla ma sain vastusest valesti aru, minu teada view ei tea modelist midagi ja vice versa

kui ma panen kõik ühe asja actionid ühte klassi, võib tekkida nn godclass, milles on tuhandeid ridu ja ideest "õhuke kontroller" ei jää midagi alles
RE: MVC Controller design
Postitaja: koodineeger(R) 2015-05-28 17:28:07
TSITEERITUD:
ja tegeled sa selle jalgratta leiutamisega mille pärast? et õppida?

jah

kui sa soovitad mul googeldada, siis ehk on sul mõned head fraasid, mille järgi otsida
olen juba üksjagu otsinud, erinevaid blogisid ja frameworkide (Symfony, Zend) dokumentatsioone lugenud, aga vastust pole leidnud

RE: MVC Controller design
Postitaja: Poiss 2015-05-28 18:14:44
TSITEERITUD:


ma ei ole päris nõus väitega, et view otse modelist andmeid küsib, võibolla ma sain vastusest valesti aru, minu teada view ei tea modelist midagi ja vice versa

kui ma panen kõik ühe asja actionid ühte klassi, võib tekkida nn godclass, milles on tuhandeid ridu ja ideest "õhuke kontroller" ei jää midagi alles


Mudel ei tea viewst midagi, aga vastupidi on täiesti OK. View ei või muuta mudeli olekut, seda küll.

Sa ei panegi kõiki actioneid ühte klassi. Minu toodud näite puhul siis kõik Useriga seotud actionid ühete klassi. Loomulikult teed sa AbstractControlleri, mida teised kontrollerid siis extendivad. Sinna paned näiteks päringu vastuvõtmise ja söödavaks töötlemisega seotud asjad jms.

Kui sa asju õigesti teed, siis saadki oma õhukesed kontrollerid. Minu õhukesed kontrollerid ületavad harva 10t rida.

Ja teistele vastajatele, ise sellise asja läbikirjutamine ja õppimine on kindlasti väärt tegevus. Ma ei jõua ära ahastada järjekordse Zend FW projekti peale, mille lähtekoodi ma näen... jah on MVC, aga progeja pole mitte midagi MVC põhimõtetest kuulnud. Controllerid on loogikat ja valideerimist täis, Mudel on andmebaasi entityd... ja mul on jälle hunnik halle karvu peas idanemas.
RE: MVC Controller design
Postitaja: Poiss 2015-05-28 18:34:32
RE: MVC Controller design
Postitaja: koodineeger(R) 2015-05-28 20:25:04
TSITEERITUD:
Kiidan sealöeldu heaks.

http://stackoverflow.com/questions/18872991/mvc-should-view-


Tänud! see jutt ajas tegelikult asja veel segasemaks :)

ma ei saa päris hästi aru kuidas view teab parameetreid, mida Modelile saata

praegu on mul nii, et kontroller küsib Modelilt näiteks fotoalbumite nimekirja (id, url, pildiurl, pealkiri jms) mingi parameetri kaudu, mida ta oskab tuvastada kas urlist või saab selle otse ajax POST muutujaga

kontrolleris on miski selline rida ($piirangud on parameeter objekti/massiivi kujul, millest Model saab aru)

$this -> View -> Listing = new \Model\Albumid ($piirangud);
$this -> View -> render ('album/detailid');

Views on template, mis näeb muutuja $this -> Listing sisu (ta ise ongi View objekt)
ja ta ei tee muud, kui ainult ketrab $this -> Listing sisu foreach'ga nt. tabeliks lahti

<table>
<?php foreach ( $this -> Listing as $album ): ?>
<tr>
<td><?php echo $album -> title; ?></td>
</tr>
<?php endforeach; ?>
</table>

-----

kui nüüd eeldada, et View peaks Modeliga otse suhtlema,
siis ok, controller otsustab taas, et

$this -> View -> render ('album/detailid');

kuidas nüüd View need $piirangud tuvastab ?


RE: MVC Controller design
Postitaja: Poiss 2015-05-28 22:06:06
View ei teagi päringu parameetreid, view küsib controlleri poolt paika sätitud modelilt vajalikud andmed. Paika sätib modeli controller, ja sellest vôib môelda nagu kaardipakist, mis segatakse ennem mängu ära, aga mängu ajal rohkem ei segata.

Kontrolleri ainuke ülesanne on vôtta vastu päring, käivitada modelis tegevused ja otsustada vastuse pôhjal milline view kuvamisele läheb. Kontroller on AINUKE koht koodis, kus sa vôid $_* super globaleid töödelda.

Küsi midagi täpsemat, loen suht diagonaalis su küsimusi ja ei ole aega pikka juhendit kirjutada.
RE: MVC Controller design
Postitaja: koodineeger(R) 2015-05-28 23:57:45
TSITEERITUD:
View ei teagi päringu parameetreid, view küsib controlleri poolt paika sätitud modelilt vajalikud andmed. Paika sätib modeli controller, ja sellest vôib môelda nagu kaardipakist, mis segatakse ennem mängu ära, aga mängu ajal rohkem ei segata.

Kontrolleri ainuke ülesanne on vôtta vastu päring, käivitada modelis tegevused ja otsustada vastuse pôhjal milline view kuvamisele läheb. Kontroller on AINUKE koht koodis, kus sa vôid $_* super globaleid töödelda.

Küsi midagi täpsemat, loen suht diagonaalis su küsimusi ja ei ole aega pikka juhendit kirjutada.


Tänud!

ma püüan hästi lihtsa näite baasil (nt foto detailid, päring: GET[id] = 23):

1) kontroller: $view = new \View();

------- View.php
class View {
public function render($name = ''){
require (sprintf('/Views/%s.php', $name));
}
}
-------

2) kontroller: $this -> view -> fotoDetailid = new \Model\FotoDetailid(GET[id]);
3) kontroller: $view -> render('foto/detailid'); // View klassis inkluuditakse fail: /Views/foto/detailid.php



4: view fails: (/Views/foto/detailid.php) pöördudakse andmete poole:

// kas seda saab pidada otse päringuks mudelist?
echo '<h1>' . $this -> fotoDetailid -> details -> title . '</h1>';
RE: MVC Controller design
Postitaja: koodineeger(R) 2015-05-29 00:02:39
vöike parandus "$this -> view" asemel on ainult "$view"

..
2) kontroller: $view -> fotoDetailid = new \Model\FotoDetailid(GET[id]);
RE: MVC Controller design
Postitaja: koodineeger(R) 2015-05-29 00:17:10
aga kui ma kontrolleris teen sellise lükke (oletame, et ainult pealkirja on vaja):

2) kontroller: $this -> view -> title = ( new \Model\FotoDetailid(GET[id]) ) -> details -> title;


ja view failis (/Views/foto/detailid.php):

// siin enam modelist enam õieti midagi alles pole, ainult üks property, mitte objekt tervikuna
echo '<h1>' . $this -> title . '</h1>';
RE: MVC Controller design
Postitaja: Poiss 2015-05-29 15:09:00
TSITEERITUD:
aga kui ma kontrolleris teen sellise lükke (oletame, et ainult pealkirja on vaja):

2) kontroller: $this -> view -> title = ( new \Model\FotoDetailid(GET[id]) ) -> details -> title;


ja view failis (/Views/foto/detailid.php):

// siin enam modelist enam õieti midagi alles pole, ainult üks property, mitte objekt tervikuna
echo '<h1>' . $this -> title . '</h1>';


Ma ei suuda reverse-engineerida siit suuremat pilti, aga asjad mis silma hakkasid:

1. proovi mitte controlleris muutujaid ükshaaval viewsse saata. Leia viis kuidas seda standardiseerida, et view teaks kust modelist andmeid küsida.

2. $_GETi jms superglobaleid ära controlleris otse kasutada. Tee mingi meetod, mis võtab parameetrid neist ära ja rohkem kusagil ära nende poole pöördu.

3. Ma loodan, et see title on tõesti asi, mis peab modelist tulema. Foto nimi näiteks. Igasugused muud pealkirjad võiks olla view teema.

4. Kui sa juba kasutad namespace, miks on sul klass FotoDetailid? Äkki Foto\Detailid ja vastav seos Foto klassi ja Detailid klassi vahel?
RE: MVC Controller design
Postitaja: koodineeger(R) 2015-05-29 16:48:31
TSITEERITUD:


Ma ei suuda reverse-engineerida siit suuremat pilti, aga asjad mis silma hakkasid:

1. proovi mitte controlleris muutujaid ükshaaval viewsse saata. Leia viis kuidas seda standardiseerida, et view teaks kust modelist andmeid küsida.


see vajab veel puremist, kas arvad midagi sellist:

$view -> viewKasutabSeda = (object) array (
'detailid' => new \Model\Foto\Detailid(id),
'seotud' => new \Model\Foto\Seosed(id),
'widgetid' => new \Model\Widget\Nimekiri('foto')
);

hiljem views pöördun ühe objekti poole ainult "$this -> viewKasutabSeda"

echo '<h1>' . $this -> viewKasutabSeda -> detailid -> title . '</h1>';


TSITEERITUD:
2. $_GETi jms superglobaleid ära controlleris otse kasutada. Tee mingi meetod, mis võtab parameetrid neist ära ja rohkem kusagil ära nende poole pöördu.


jah, muidugi, ma lihtsalt tegin liiga lihtsustatud näite

TSITEERITUD:
3. Ma loodan, et see title on tõesti asi, mis peab modelist tulema. Foto nimi näiteks. Igasugused muud pealkirjad võiks olla view teema.


see ei ole taaskord väga õnnestud näide mul, mõte on, et mul on tsipa unversaalsem Model, kuid View ei vaja kogu kraami, selle title asemel võib olla ka näiteks "meta", mis on omakorda objekt

hiljem kasutan views: $meta -> title, $meta -> author -> id etc

TSITEERITUD:
4. Kui sa juba kasutad namespace, miks on sul klass FotoDetailid? Äkki Foto\Detailid ja vastav seos Foto klassi ja Detailid klassi vahel?


jah, päris kood ongi sinna poole, nagu sa kirjeldad, lihtsalt kiirustasin näite tegemisega,
tegelik namespace on oluliselt pikem :)
RE: MVC Controller design
Postitaja: Arvi V 2015-06-01 14:47:38
Milleks ikka jalgratast leiutada?

Aga mõistlik oleks ikkagi kontrolleris tegeleda päringu, mudeli ja muu loogikaga ja vastavalt kutsuda view välja.
View-i annad andmed objektide massiivina edasi.

Controller võiks olla selline.
public function actionView($id){
$pildid = Pildid::find($id);
echo $this->render('pildid',array('pildid'=>$pildid));
}

ja pildid.php vaates

<?php echo $pildid->nimi; ?>
URL on siis pildid/view/123

Selline loogika on kasutusel näiteks Yii-s.

Leheküljed: 1

©2002-2013 Martin Rebane & PHP.ee kaasautorid
  0.0943081378937