Toon posts:

[PHP] Klasse-Database Connectie

Pagina: 1
Acties:
  • 132 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik zit al een tijdje te bekijken wat de beste oplossing is voor de samenwerking tussen database en een klasse/object. Stel ik heb een klasse "persoon" die een aantal properties heeft. Deze worden bij de creatie van het object gevuld dmv een meegegeven id en een database query.

Vervolgens wil ik de gegevens op het scherm laten zien. Tot nu toe is alles wel goed, maar als ik nu een beheerkant wil maken om een persoon aan te passen is het volgende dan een goede manier:

Ik maak in de klasse persoon een functie edit en een functie delete waar de beheerkant het object mee kan aanpassen en wellicht een aparte functie save voor het definitief opslaan in de database.

Maar mijn uiteindelijke vraag is of het ook wel een goed idee is om het edit-formulier zelf ook in een functie van de klasse te zetten of dat dit netter is om ergens anders te doen, maar waar dan bijvoorbeeld?

  • sariel
  • Registratie: Mei 2004
  • Laatst online: 07-12-2025
Tsja, ik zou een class persoon hebben, die gegevens via de class database uit een database haalt.

maw:
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
class database {
    function __construct()
    {
    }

    function query($string)
    {
      .
      .
    }
.
.
}

class persoon {
   function __construct($id)
   {
     global $db;
      this->db = $db;
      if($id)
      $this->data = $this->db->query("select * from persoon where id=$id");
   }
   function display()
   {
      print_r($this->data);
   }
}



edit: en wat betreft formulieren in je classes zetten......nee, nooit, doe het niet!!!!!!!!
dat vervuilt je classes met onleesbare TROEP, en je zult zo veel meer moeten zoeken om je functionele code te vinden.......gebruik gewoon een template classes, en zet variabelen er in. Ook makkelijker als je ineens van layout wil veranderen.

[ Voor 28% gewijzigd door sariel op 14-03-2006 15:24 ]

Copy.com


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:08

Janoz

Moderator Devschuur®

!litemod

Edit formulier moet je sowieso niet in die class zetten. Je moet proberen je buisnesslogic zo veel mogelijk te scheiden van je presentatie. Mocht je dan je presentatie aanpassen dan hoef je niet je hele buisneslogic overhoop te gooien en vice versa.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 04-01 15:49

JHS

Splitting the thaum.

Zowel de presentatielogica als het daadwerkelijke formulier horen beiden niet in je user class :) . Het MVC model is in deze een stuk praktischer, waarschijnlijk. De V(iew) zou je kunnen vormgeven met templates, waarbij je gewoon gebruik zou kunnen maken van de PHP functies. Een manier om dat te doen is een class te hebben die het gehele proces regelt, en die zorgt dat de in de Controller* gemaakte variabelen ook beschikbaar zijn in de View. Je zou ook kunnen overwegen om aan het eind van je Controller de View/template expliciet aan te roepen, bijvoorbeeld door deze te includen.

* Je Controller is in deze dus hetgeen dat de data uit je Models haalt. De user class zou een Model zijn, maar hier is werkelijk een hele hoop over te vinden.

DM!


Verwijderd

Topicstarter
Ik heb nu een eigen template engine die een array van variabelen in een template zet. Hierbij heb ik bijvoorbeeld ook een klasse table die met bepaalde data (bijvoorbeeld de persoon-data) een tabel maakt. Dit tabel-object wordt dan door de template engine in de template gezet. Maar de vraag is waar regel ik het aanmaken en vullen van het tabel-object (bijvoorbeeld), als ik het goed is moet dat dus gebeuren door de "controller"?

[ Voor 91% gewijzigd door Verwijderd op 14-03-2006 15:33 ]


  • sariel
  • Registratie: Mei 2004
  • Laatst online: 07-12-2025
Wat het netste blijft......is niet code met daarin stapels en stapels html.
Het is beter om de hoeveelheid html en overige nutteloze zooi zo veel mogelijk uit je code te houden. Heb je voor de gein wel eens een opensource site geschreven in php bekeken? 9 van de 10 keer zien je dat er html door de code staat. kan je dan in 1 oogopslag zien wat wel en niet nuttige code is?

je hoeft niet voor elke class aparte templates te bakken. alleen voor te classes die output geven moet je templates bakken, en dat is niet al te moeilijk, mits je een goede template engine gebruikt. En daar zijn er eigenlijk genoeg van te vinden.
En hoe je je template-lijst netjes kan houden? Maak een template mapje in je project, maak daar dan per class (die output geeft) een mapje, en dan in dat class-mapje zet je de templates van die class. heb je alles overzichtelijk, en weet je welk template je moet aanpassen als je een class aanpast.

Copy.com


Verwijderd

Topicstarter
Zover ben ik wel, maar ik wil dus niet in de template het formulier gaan maken, maar ik weet ook nog niet waar dan wel...

  • sariel
  • Registratie: Mei 2004
  • Laatst online: 07-12-2025
Het vullen van je tabel-object kan je in (een van) de output functie(s) van je class zetten.

Ik zelf heb meestal een stapeltje output functies: een voor view, een voor edit, en een voor short-info.
Alle 3 roepen hetzelfde template object aan, met een ander template als parameter, en vullen alle template gegevens in in het template object.
Het template object wordt dan uiteindelijk als (een na) laatste regel van m'n HOOFD php script geoutput, zodat ik tijdens het runnen van m'n script nog altijd de data van het template object kan wijzigen, indien nodig (tot nu toe niet, maar ok)

Copy.com


  • sariel
  • Registratie: Mei 2004
  • Laatst online: 07-12-2025
Verwijderd schreef op dinsdag 14 maart 2006 @ 15:35:
Zover ben ik wel, maar ik wil dus niet in de template het formulier gaan maken, maar ik weet ook nog niet waar dan wel...
Waarom niet? Wat is er mis om een formulier in een template te hebben?

Copy.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:32
Wellicht hoort dit beter in SA&E

p&w->sa&e

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:32
Ik zou zowiezo geen queries in m'n 'persoon' class zetten.

Ik zou een aparte class maken, die persoon objecten kan saven en ophalen.

https://fgheysels.github.io/


  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 04-01 15:49

JHS

Splitting the thaum.

Verwijderd schreef op dinsdag 14 maart 2006 @ 15:35:
Zover ben ik wel, maar ik wil dus niet in de template het formulier gaan maken, maar ik weet ook nog niet waar dan wel...
Doe in een (abstract / interface) basis class waar je controllers / outputtende scripts childs van zijn een build_form_info(); functie, en in je template class een build_form($form_info); functie?

DM!


Verwijderd

Topicstarter
sariel schreef op dinsdag 14 maart 2006 @ 15:39:
[...]


Waarom niet? Wat is er mis om een formulier in een template te hebben?
Hoe ik het wou doen is ergens een formulier object te laten maken met behulp van de persoon-klasse, dit formulier-object door te geven aan de template engine die het vervolgens in de template zet.

Verwijderd

Topicstarter
Volgens mij ben ik nu heel onduidelijk, ik zal m'n vraag van nu nog eens opnieuw verwoorden. Ik heb een persoon-object op basis waarvan een formulier-object wordt gemaakt om dit object aan te passen. Dit formulier-object wordt via de template engine dan in html omgezet voor de weergave. Mijn vraag is nu waar ik het aanmaken van het formulier-object voor het persoon-object het beste kan doen... ik weet niet of dit op een manier kan die voor alle klassen/objecten werkt of dat ik dit per klasse (dan wellicht in de persoon klasse zelf) moet doen?

Edit: Zo te zien is nu iedereen het topic kwijt nu het uit het programmeren forum verplaatst is :(

[ Voor 12% gewijzigd door Verwijderd op 14-03-2006 16:10 ]


  • Observer
  • Registratie: April 2001
  • Laatst online: 19:53
Wat mijn oplossing zou zijn (en wat de meesten hier je ook proberen te vertellen) is dit:

Je hebt in principe drie objecten: Persoon, Formulier en een Controller. De controller is het script dat dingen doet aan de hand van de acties van de gebruiker.

In de Controller doe je, om het formulier te tonen, dit:
- laad een Persoon object (via id)
- laad een Formulier object (blanco)
- vraag aan het Persoon-object de benodigde gegevens op voor het formulier
- voeg deze toe aan het formulier object
- zeg tegen het formulier "zichzelf af te beelden"

Je kan dit nog verbeteren door het Formulier object te vervangen door een TemplateLader object die een fysiek bestand persoonFormulier.tpl als argument meekrijgt. Je laad dan een TemplateLader object en geeft de data uit het Persoon object mee aan TemplateLader. Deze leest het bestand persoonFormulier.tpl in en vult die data op de juiste plaats in (adhv tags). Bij het zichzelf tonen print de TemplateLader de ingevulde inhoud van persoonFormulier af.

Moet er nu een Groep object in een formulier getoond worden dan kan je in bijna dezelfde code gebruiken: laad Groep, laad TemplateLader met een groepFormulier.tpl, vraag de gegevens weer op en wijs deze toe aan de TemplateLader en laat deze zichzelf tonen --> klaar!

Wijzigd de naam van een database veld van Persoon, dan hoef je alleen maar de Persoon klasse wijzigen en niet de template of de controller. wil je een andere layout: wijzig de template, en bekommer je niet om de Persoon klasse.

There are 10 kinds of people in the world: those that understand binary and those that don't


Verwijderd

Klasse persoon komt op mij over als een model. Zoals aangegeven moet je je presentatie (view) niet in het model stoppen. Daarmee beperk je je tot een weergave op dezelfde logica.

Het model moet alleen basale acties doen met betrekking tot het ophalen van data. De controller moet acties mappen naar aanroepen op je model en er een view aan knopen. Kijk eens naar Mojavi voor een voorbeeld van een lichtgewicht MVC framework voor PHP.

Daarnaast weet ik niet of je de beschikking hebt over PHP5, maar dan zou je erg mooi het ActiveRecord pattern van Fowler kunnen volgen, zodat het schrijven van modellen dynamisch wordt afgehandeld.

Je zal dan iets krijgen als;

PHP:
1
2
3
4
5
6
7
8
9
10
if (($person_id = $request->getParameter('person_id')) == null) {
  $p = new Person();
} else {
  $p = Person::retrieveByPrimaryKey((int)$person_id);
}

$p->setName('John');
$p->setAge(19);

$p->save();

Verwijderd

Topicstarter
Maar is het dan wel een goed idee om in dat model aan te geven of de data bijvoorbeeld moet worden weergegeven in een tabel of in een form om te worden aangepast?

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 04-01 15:49

JHS

Splitting the thaum.

In principe heeft, van het MVC model uitgaande, het Model daar weinig mee te maken, lijkt me. Volgens mij is je Model daar verantwoordelijk voor het toegankelijk maken van data en gegevens omtrend die data, en dus in geen enkele zin voor de weergave :) .

DM!


Verwijderd

Topicstarter
OK, ik ga eens wat klooien want ik zie het even niet helemaal voor me in de praktijk, iig bedankt!

Verwijderd

Heel kort door de bocht genomen werkt het framework van mij als volgt.

Als eerste vindt er een mapping plaats van URL, naar interne URL.

http://site.com/news/add -> http://site.com/index.php?module=news&action=add

index.php initieert:

* een request object zodat je abstract in alle objecten request parameters op kan vragen zonder $_GET, of $_POST of zelfs via de global namespace.
* een user object, voor data van de gebruiker
* controller object
* storage object, voor algemene data-opslag

vervolgend zal de execute methode van de controller aangeroepen worden. In dit geval is er een WebController die bepaalt welke actie uit welke module aangeroepen moet worden. (dat haalt de webcontroller uit de URL).
Vervolgens wordt er een Filter chain aangeroepen (Chain of Responsibility), waarbij de binnenste Filter altijd de ExecutionFilter is.

PHP:
1
2
3
4
5
6
7
8
9
10
$viewName = $controller->executeAction($controller->getModuleName(), $controller->getActionName());

if ($viewName != View::None()) {
  $view = &$controller->getView ($controller->getModuleName(), $controller->getActionName(), $viewName);

  $view->execute ();

  $output = $view->render ();

  echo $output;

Dat wordt onder andere aangeroepen. Het Framework mapt de module en actie naar een bepaald bestand op de server. Include die, voert de Action uit (in de Action worden alleen berekeningen gedaan en de Action bepaalt welke View er gebruikt moet worden).
executeAction levert dus een View op, en aan de hand daarvan wordt de View aangemaakt en gerendered. Dat is zeg maat het idee van MVC.

Controller -> welke actie moet ik uitvoeren bij welke module (of iedere module een eigen controller geven, maar goed, dat is een keuze die je zelf maakt) en voer die actie ook uit met behulp van de Actions. Actions zijn dus eigenlijk onderdeel van de Controller.
View -> Koppelt een view aan de Actie
Model -> Modellen worden gebruikt binnen de Actions.

Met behulp van Model View Controller is het eenvoudig om voor een Overview actie van News een HtmlView, PdfView, WordView, WhateverView te maken.
Pagina: 1