MVC en OOP
Ok, ik ben begonnen met Kohana en dit is MVC gebaseerd.
Ik heb een pagina Producten (www.example.com/producten) door de router class wordt de pagina automatisch gemaakt door de producten controller.
Nu zouden alle hoofdcategorien te zien moeten zijn op deze pagina. Dat kan heel makkelijk door gewoon even een methode aan te spreken in mijn producten model en deze dan via mijn controller door te spelen aan de view.
Maar nu zou ik graag elke hoofdcategorie als een object zien, dus ik heb een aparte class aan gemaakt productcategorie.
Even een voorbeeldje van hoe die class zou integreren in mijn controller.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
class Controller_Producten extends Controller_MainTemplate{
private $view;
private $model;
private $categorie;
public function action_index(){
$this->view = new View('producten/categorie');
$this->model = new Model_Producten();
$this->categorie = new Product_Categorie();
//inhoud van de home view
$this->view->title = 'Test';
$this->view->content = 'test producten pagina';
//categorien --> hier gaat het dus om
$categorien = $this->model->getCategories();
$drawcategorien = array();
foreach($categorien as $cat){
$drawcategorien[] = $this->Categorie->getCategorie($cat['id']));
}
$this->view->categorien = $drawcategorien;
//set title
$this->template->title = 'Home';
//render Template met view
$this->template->content = $this->view;
}
}
?>
class Controller_Producten extends Controller_MainTemplate{
private $view;
private $model;
private $categorie;
public function action_index(){
$this->view = new View('producten/categorie');
$this->model = new Model_Producten();
$this->categorie = new Product_Categorie();
//inhoud van de home view
$this->view->title = 'Test';
$this->view->content = 'test producten pagina';
//categorien --> hier gaat het dus om
$categorien = $this->model->getCategories();
$drawcategorien = array();
foreach($categorien as $cat){
$drawcategorien[] = $this->Categorie->getCategorie($cat['id']));
}
$this->view->categorien = $drawcategorien;
//set title
$this->template->title = 'Home';
//render Template met view
$this->template->content = $this->view;
}
}
?>
Nu is mijn vraag of dit nu de juiste werkwijze is of dat ik de bal totaal mis sla.
Gewijzigd op 01/01/1970 01:00:00 door Mr.Moe
maar als ik dit zou maken zou ik dit deel niet in een class zetten.
Vooral dit deel zou ik er niet in hebben gezet:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$this->view = new View('producten/categorie');
$this->model = new Model_Producten();
$this->categorie = new Product_Categorie();
//inhoud van de home view
$this->view->title = 'Test';
$this->view->content = 'test producten pagina';
?>
$this->view = new View('producten/categorie');
$this->model = new Model_Producten();
$this->categorie = new Product_Categorie();
//inhoud van de home view
$this->view->title = 'Test';
$this->view->content = 'test producten pagina';
?>
Maar je kan beter wachten tot een reactie van iemand die hier meer verstand van heeft, ik ben zelf ook een beginner.
Waarom geeft Model_Producten::getCategories() niet direct een array met instanties van Product_Categorie-instanties terug? Dat lijkt mijn mooier dan slechts nummertjes teruggeven.
En je hebt een apart model voor de producten (Model_Producten), kan je dan ook niet zoeentje maken voor categorieën? Beiden zijn toch ongeveer even belangrijk? En het is een beetje vreemd om het model dat de producten beheert naar alle beschikbare categorieën te vragen, al zou ik me daar nog wel in kunnen vinden.
Jelmer schreef op 05.01.2010 23:22:
... Beiden zijn toch ongeveer even belangrijk? En het is een beetje vreemd om het model dat de producten beheert naar alle beschikbare categorieën te vragen, al zou ik me daar nog wel in kunnen vinden.
Zoals ik al vermelde ben ik namelijk bijna verplicht om dit te doen als ik deze url wil: www.example.com/producten.
Dat apart model kan ik volgen en dat was eigenlijk ook de bedoeling om dit nog te doen.
Jelmer schreef op 05.01.2010 23:22:
Waarom geeft Model_Producten::getCategories() niet direct een array met instanties van Product_Categorie-instanties terug? Dat lijkt mijn mooier dan slechts nummertjes teruggeven.
Je bedoelt hier dat ik deze eigenlijk gewoon uit mijn tabel moet halen en verder niets mee doen? Dan ben je toch helemaal niet object georienteerd bezig, of wel? Of moet ik vanuit die methode die objecten aanmaken, die in een array steken en deze terug geven?
Ik bedoelde inderdaad dat je in getCategories al direct objecten teruggeeft. Want dat is juist wel object georiënteerd programmeren. Je werkt dan immers daadwerkelijk alleen nog met objecten. Niet meer met nummertjes die slechts verwijzen naar objecten.
Ik hou jullie op de hoogte over het verder verloop. Ik weet wel niet dat het iets voor in het kort gaat zijn, want ik zit met de examens in het vooruitzicht.
Gewijzigd op 01/01/1970 01:00:00 door Mr.Moe
Meestal heb je al de properties van je parent-class nodig, en meestal zorgen de methods van de parent-class daar grotendeels al voor. Heb je een voorbeeld van jouw probleem?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
//categorie
class ProductCategorie{
protected $catId;
protected $catName;
protected $catDescription;
public function __construct($id, $name, $description){
$this->catId = $id;
$this->catName = $name;
$this->catDescription = $description;
}
public function getCatId(){
return $this->catId;
}
public function getCatName(){
return $this->catName;
}
public function getCatDescription(){
return $this->catDescription;
}
}
//subcategorie
class ProductSubcategorie extends ProductCategorie{
protected $subCatId;
protected $subCatName;
protected $subCatDescription;
public function __construct($id, $name, $description, $catId = 0){
$this->catId = $catId;
$this->subCatId = $id;
$this->subCatName = $name;
$this->SubCatDescription = $description;
}
public function getSubCatId(){
return $this->subCatId;
}
public function getSubCatName(){
return $this->subCatName;
}
public function getSubCatDescription(){
return $this->subCatDescription;
}
}
?>
//categorie
class ProductCategorie{
protected $catId;
protected $catName;
protected $catDescription;
public function __construct($id, $name, $description){
$this->catId = $id;
$this->catName = $name;
$this->catDescription = $description;
}
public function getCatId(){
return $this->catId;
}
public function getCatName(){
return $this->catName;
}
public function getCatDescription(){
return $this->catDescription;
}
}
//subcategorie
class ProductSubcategorie extends ProductCategorie{
protected $subCatId;
protected $subCatName;
protected $subCatDescription;
public function __construct($id, $name, $description, $catId = 0){
$this->catId = $catId;
$this->subCatId = $id;
$this->subCatName = $name;
$this->SubCatDescription = $description;
}
public function getSubCatId(){
return $this->subCatId;
}
public function getSubCatName(){
return $this->subCatName;
}
public function getSubCatDescription(){
return $this->subCatDescription;
}
}
?>
Momenteel geef ik enkel de id van de hoofdcategorie mee door wanneer ik een subcategorie object maak.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
//categorie
class ProductCategory
{
protected $catId;
protected $catName;
protected $catDescription;
public function __construct($id, $name, $description){
$this->catId = $id;
$this->catName = $name;
$this->catDescription = $description;
}
public function getCatId(){
return $this->catId;
}
public function getCatName(){
return $this->catName;
}
public function getCatDescription(){
return $this->catDescription;
}
}
class ProductSubCategory extends ProductCategory
{
protected $parentCategoryId;
public function __construct($parentCategoryId, $id, $name, $description)
{
$this->parentCategoryId = $parentCategoryId;
parent::__construct($id, $name, $description);
}
public function getParentCategoryId()
{
return $this->parentCategoryId;
}
}
?>
//categorie
class ProductCategory
{
protected $catId;
protected $catName;
protected $catDescription;
public function __construct($id, $name, $description){
$this->catId = $id;
$this->catName = $name;
$this->catDescription = $description;
}
public function getCatId(){
return $this->catId;
}
public function getCatName(){
return $this->catName;
}
public function getCatDescription(){
return $this->catDescription;
}
}
class ProductSubCategory extends ProductCategory
{
protected $parentCategoryId;
public function __construct($parentCategoryId, $id, $name, $description)
{
$this->parentCategoryId = $parentCategoryId;
parent::__construct($id, $name, $description);
}
public function getParentCategoryId()
{
return $this->parentCategoryId;
}
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
@Jelmer: Had er zo nog niet bij stil gestaan, maar je hebt gelijk. Merci
@Jelmer: Als ik hier nu nog een class product heb, moet ik deze dan ook extenden met de class productsubcategory of gaat dit geen meerwaarde hebben?
Mr.Moe schreef op 13.01.2010 16:25:
Vraag je af of een 'productsubcategory' altijd een 'product' is en of je dus wel op die manier mag extenden. Dan blijkt al vrij snel dat je dat nooit kunt doen!@Jelmer: Als ik hier nu nog een class product heb, moet ik deze dan ook extenden met de class productsubcategory of gaat dit geen meerwaarde hebben?
Een categorie is een eigenschap van een product, net zoals een subcategorie dat zou zijn. Extenden is hier niet mogelijk.
Een productcategorie is wel een soort categorie
Dus een product hoort niet een productcategorie te extenden.
Ik had al zo een vermoeden, wou het gewoon even navragen. Alvast bedankt.